腳本1-38
1、寫一個腳本:創建一個用戶little,如果用戶已經存在,就提示用戶已經存在的信息,否則將創建用戶。
答:
!/bin/bash
#創建用戶
#
id $1 &> /dev/null && echo "$1 is exist" || useradd $1
[root@little ~]# bash 1.sh little
little is exist
2、寫一個腳本,列出系統中默認shell的bash用戶。
答:
#!/bin/bash
#找出bash用戶
#
if grep -q "bash$" /etc/passwd; then
grep "bash$" /etc/passwd | cut -d ":" -f1
fi
[root@little ~]# bash 2.sh
root
little
mysql
ling
3、創建一個用戶,如果用戶已經存在,就提示用戶已經存在的信息,否則將創建用戶。
答:
#!/bin/bash
#判斷用戶並創建
#
if id $1 &> /dev/null; then
echo "$1 is exist"
else
useradd $1
echo $1 | passwd --stdin $1
echo "$1 is create seccessfully"
fi
[root@little ~]# bash 3.sh ling
ling is exist
4、寫一個腳本,給腳本傳遞用戶名參數,判斷參數數量是否合格,並且判斷用戶是否存在,如果存在,就顯示相應信息,否則就創建之並為其設置密碼。
答:
#!/bin/bash
#創建用戶和密碼
#
if [ $# -ne 1 ]; then
echo "You can only input one username"
exit
fi
if id $1 &> /dev/null; then
echo "$1 is exist"
else
useradd $1
echo $1 | passwd --stdin $1
echo "$1 is create successfully"
fi
[root@little ~]# bash 4.sh ling
ling is exist
5、read腳本。
答:
#/bin/bash
#read函數
#
read -p "please inpout one option: "
[root@little ~]# bash 5.sh
please inpout one option: ^C
6、寫一個腳本,能夠添加或刪除用戶賬戶,可以使用-a選項完成添加,使用-d選項完成刪除任務。
答:
#!/bin/bash
#添加刪除用戶
#
if [ $# -ne 2 ]; then
echo "Usage: $(basename $0) -a username | -d username"
exit
fi
if [ $1 == ‘-a‘ ]; then
if id $2 &> /dev/null; then
echo "$2 is exist"
else
useradd $2
echo $2 | passwd --stdin $2
echo "$2 is add successfully"
fi
fi
if [ $1 == ‘-d‘ ]; then
if id $2 &> /dev/null; then
userdel -r $2
echo "$2 is delete"
else
echo "$2 is not exist"
fi
fi
[root@little ~]# bash 6.sh -a ling
ling is exist
7:判斷給出的文件大小是否大於100kb,如果大於100kb,就顯示這是個大文件,否則就顯示這是一個小文件。
答:
#!/bin/bash
#判斷文件大小
#
if ! id $1 &> /dev/null; then
echo "$1 is not exist"
exit
fi
filesize=$(wc -c < $1)
if [ $filesize -gt 102400 ]; then
echo "$1 is a big file"
else
echo "$1 is a small file"
fi
8:判斷給出的一個字符串是否為整數。
答:
#!/bin/bash
#判斷是否為整數
#
if echo $1 | grep "^\<[[:digit:]]\+\>$" &> /dev/null; then
echo "$1 is a integer"
else
echo "$1 is not integer"
fi
[root@little ~]# ./8.sh 666
666 is a integer
9、寫一個腳本,shift作用。
答:
#!/bin/bash
#shift作用
#
while [ $# -ne 0 ]; do
echo -e "第一個參數為:$1\n參數總數為:$#"
shift
done
[root@little ~]# ./9.sh 2 3 56
第一個參數為:2
參數總數為:3
第一個參數為:3
參數總數為:2
第一個參數為:56
參數總數為:1
10、寫一個腳本,求寫入的參數之和。
答:
#!/bin/bash
#求參數之和
#
if [ $# -eq 0 ]; then
echo "Usage: $(basename $0) 參數"
exit
fi
sum=0
until [ $# -eq 0 ]; do
sum=$[$sum+$1]
shift
done
echo "sum is $sum"
[root@little ~]# bash 10.sh 1 2 3 4
sum is 10
11、示例6的擴展,用shift實現:寫一個腳本,能夠添加或刪除用戶賬戶,可以使用-a選項完成添加,使用-d選項完成刪除任務。
答:
#!/bin/bash
#shift實現創建和刪除
#
if [ $# -ne 2 ]; then
echo "Usage: $(basename $0) -a username | -d username"
exit
fi
if [ $1 == ‘-a‘ ]; then
shift
if id $1 &> /dev/null; then
echo "$1 is exist"
else
useradd $1
echo $1 | passwd --stdin $1 &> /dev/null
echo "create $1 successfully"
fi
fi
if [ $1 == ‘-d‘ ]; then
shift
if id $1 &> /dev/null; then
userdel -r $1
echo "delete $1 already"
else
echo "$1 is not exist"
fi
fi
[root@little ~]# ./11.sh -a ling
ling is exist
12、簡易計算器(不能計算乘法,註意:乘法要用"\*")
答:
#!/bin/bash
#簡易計算器
#
if [ $# -ne 3 ]; then
echo "please input three digits"
exit
fi
echo $[$1$2$3]
[root@little ~]# bash 12.sh 3 \* 5
15
13、編寫一個腳本,要求:從/etc/passwd中UID和GID相同的用戶中隨機選擇一個用戶,判斷其用戶的類型:UID為0,即超級用戶;UID在1-999之間,即系統用戶;UID為1000+,即登錄用戶。
答:
#!/bin/bash
#判斷UID和gid相同的用戶
#
lines=$(grep "\<\([[:digit:]]\+\)\>.*\1" /etc/passwd | wc -l)
sequence=$[$RANDOM%$lines+1]
username=$(grep "\<\([[:digit:]]\+\)\>.*\1" /etc/passwd | sort -n -t ":" -k 3 | head -n $sequence | tail -1 | cut -d ":" -f1)
userid=$(id -u $username)
if [ $userid -eq 0 ]; then
echo "$username is 超級用戶"
elif [ $userid -ge 1000 ]; then
echo "$username is 登錄用戶"
else
echo "$username is 系統用戶"
fi
[root@little ~]# ./13.sh
vcsa is 系統用戶
[root@little ~]# ./13.sh
root is 超級用戶
[root@little ~]# ./13.sh
rpcuser is 系統用戶
14、寫一個腳本,能夠添加或刪除一個或多個用戶賬戶,可以使用-a選項完成添加,使用-d選項完成刪除任務。
答:
#!/bin/bash
#用戶添加刪除
#
if [ $# -ne 2 ]; then
echo "Usage: $(basename $0) -a username | -d username"
exit
fi
if [ $1 == ‘-a‘ ]; then
shift
for I in $*; do
if id $I &> /dev/null; then
echo "$I is exist already"
else
useradd $I
echo $I | passwd --stdin $I &> /dev/null
echo "create $I seccessfully"
fi
done
fi
if [ $1 == ‘-d‘ ]; then
shift
for I in $*; do
if id $I &> /dev/null; then
userdel -r $I
echo "delete $I already"
else
echo "$I is not exist"
fi
done
fi
[root@little ~]# bash 14.sh
Usage: 14.sh -a username | -d username
[root@little ~]# bash 14.sh -a ling
ling is exist already
15、計算100以內所有整數的和。
答:
#!/bin/bash
#100以內的整數和
#
read -t 10 -p "please input a integer: " integer
if [ -z $integer ]; then
echo "pleae input a integger"
exit
fi
if ! echo $integer | grep -q "^\<[[:digit:]]\+\>$" &> /dev/null; then
echo "please input a integer"
exit
fi
sum=0
for I in $(seq $integer); do
sum=$[$sum+$I]
done
echo "$integer 以內的整數和為:$sum"
[root@little ~]# ./15.sh
please input a integer: 10
10 以內的整數和為:55
16、寫一個腳本,打印倒置的等腰三角形。
答:
#!/bin/bash
#打印倒置三角形
#
if [ $# -eq 0 ]; then
echo "please input row number"
exit
fi
for I in $(seq $1); do
for J in $(seq $[I-1]); do
echo -n " "
done
for K in $(seq $[2*($1-$I)+1]); do
echo -n "*"
done
echo
done
[root@little ~]# bash 16.sh
please input row number
[root@little ~]# bash 16.sh 4
*******
*****
***
*
17、打印九九乘法表。
答:
#!/bin/bash
#九九乘法表
#
for I in $(seq 9); do
for J in $(seq $I); do
echo -ne "$J*$I=$[$J*$I]\t"
done
echo
done
[root@little ~]# ./17.sh
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
18、寫一個腳本,算出100以內的整數和(C語言風格)。
答:
#!/bin/bash
#100以內的整數和
#
sum=0
for ((I=1;I<=100;I++)); do
let sum=$[$sum+$I]
done
echo "100 以內的整數和為:$sum"
[root@little ~]# bash 18.sh
100 以內的整數和為:5050
19、查找/var目錄中所有的空文本文檔,並刪除。
答:
#!/bin/bash
#刪除var下的空文檔
#
for I in $(ls -d /var/*); do
if [ -f $I ]; then
if [ ! -s $I ]; then
rm -f $I
echo "delete $I successfully"
fi
fi
done
20、寫一個腳本:提示用戶輸入信息,然後判斷用戶輸入的信息是否合法。
答:
#!/bin/bash
#判斷用戶輸入信息是否合法
#
read -p "please input your choice yes|no:" choice
case $choice in
[Yy][Ee][Ss])
echo "This is right."
;;
[Nn][Oo])
echo "This is fault."
;;
*)
echo "please input your choice yes|no"
;;
esac
[root@little ~]# bash 20.sh
please input your choice yes|no:yes
This is right.
21、寫一個腳本,管理用戶賬戶的腳本,case實現a添加和d刪除(case分支實現)。
答:
#!/bin/bash
#用戶賬戶管理
if [ $# -lt 2 ]; then
echo "please input two facters"
exit
fi
case $1 in
-a)
for I in $(echo $2 | tr "," " "); do
if id $I &> /dev/null; then
echo "$I is exist."
else
useradd $I
echo $I | passwd --stdin $I
fi
done
;;
-d)
for I in $(echo $2 | tr "," " "); do
if id $I &> /dev/null; then
userdel -r $I
echo "delete $I already."
else
echo "$I is not exist."
fi
done
;;
*)
echo "Usage: $(basename $0) -a username1,username2... | -d username1,username2..."
exit
;;
esac
[root@little ~]# ./21.sh -a ling
ling is exist.
22、寫一個腳本,利用while循環結構,計算100以內所有整數的和。
答:
#!/bin/bash
#100以內的整數和,while循環
#
declare -i I=1
sum=0
while [ $I -le 100 ]; do
let sum=$[$sum+$I]
let I++
done
echo "100以內的整數和(while循環)為:$sum"
[root@little ~]# bash 22.sh
100以內的整數和(while循環)為:5050
23、寫一個腳本,利用until循環結構,計算100以內所有整數的和。
答:
#!/bin/bash
#100以內的整數和,until循環
#
declare -i I=1
sum=0
until [ $I -gt 100 ]; do
let sum=$[$sum+$I]
let I++
done
echo "100以內的整數和(until循環)為:$sum"
[root@little ~]# ./23.sh
100以內的整數和(until循環)為:5050
24、寫一個腳本,判斷是否為正確文本文件,以bash腳本格式打開一個文本文檔。
答:
#!/bin/bash
#以bash文本輸入
#
if [ $# -eq 0 ]; then
echo "please input one parameter"
exit
fi
if [ ! -e $1 ]; then
echo "$1 is not exist."
exit
fi
if [ ! -f $1 ]; then
echo "please input a txt file."
exit
fi
until false; do
vi + $1
if bash -n $1; then
break
else
continue
fi
done
[root@little ~]# ./24.sh 23.sh
[root@little ~]#
# 進入23.sh腳本
25、寫一個腳本,用select創建菜單式列表。
答:
#!/bin/bash
#select菜單列表
#
select I in rice soup meat corn; do
case $I in
rice)
echo "I like rice"
break
;;
soup)
echo "I do not like soup"
break
;;
meat)
echo "I like meat"
break
;;
cron)
echo "corn is nice for us"
break
;;
*)
echo "please choise 1(rice)|2(soup)|3(meat)|4(corn)"
continue
;;
esac
done
[root@little ~]# bash 26.sh
1) rice
2) soup
3) meat
4) corn
#? 1
I like rice
26、編寫一個shell腳本將/usr/local命令下大於100k的文件轉移到/tmp目錄下(略錯)。
答:
#!/bin/bash
#/usr/local下的文件復制
#
path=/usr/local
des=/tmp
for I in $path/*; do
if [ $(wc -c < $I) -gt 102400 ]; then
mv $I $des
ls -l $I
fi
done
27、寫一個具有systemV風格的腳本:給腳本傳遞一些參數,如start、stop、restart、status。
答:
#!/bin/bash
#系統的start/stop/restart/status
#
lockfile="/var/local/subsys/$(basename $0)"
case I in
start)
if [ -f $lockfile ]; then
echo "service start up already"
else
touch $lockfile
echo "service is starting"
fi
;;
stop)
if [ -f $lockfile ]; then
rm -f $lockfile
echo "service was stop"
else
echo "service is stop"
fi
;;
restart)
if [ -f $lockfile ]; then
echo "service start up already"
else
touch $lockfile
echo "service is starting"
fi
if [ -f $lockfile ]; then
rm -f $lockfile
echo "service was stop"
else
echo "service is stop"
fi
;;
status)
if [ -f $lockfile ]; then
echo "service is running"
else
echo "service is stop"
fi
;;
esac
[root@little ~]# ./27.sh start
touch: 無法創建"/var/local/subsys/27.sh": 沒有那個文件或目錄
service is starting
28、寫一個腳本,創建用戶局部變量。
答:#!/bin/bash
#局部變量創建多用戶
#
adduser() {
for I in {1..5}; do
if id $1$I /&> /dev/null; then
echo "$1$I is exist"
else
useradd $1$I
echo $1$I | passwd --stdin $1$I
echo "create $1$I successfully"
fi
done
}
adduser $1
[root@little ~]# bash 28.sh
更改用戶 1 的密碼 。
passwd: 所有的身份驗證令牌已經成功更新。
create 1 successfully
更改用戶 2 的密碼 。
passwd: 所有的身份驗證令牌已經成功更新。
create 2 successfully
更改用戶 3 的密碼 。
passwd: 所有的身份驗證令牌已經成功更新。
create 3 successfully
更改用戶 4 的密碼 。
passwd: 所有的身份驗證令牌已經成功更新。
create 4 successfully
更改用戶 5 的密碼 。
passwd: 所有的身份驗證令牌已經成功更新。
create 5 successfully
29、寫一個腳本,調用函數,本地變量。
答:
#!/bin/bash
#本地和局部變量
#
name=little
func() {
local name=ling
echo "func_name=$name"
}
func
echo "external_name: $name"
[root@little ~]# bash 29.sh
func_name=ling
external_name: little
30、寫一個腳本,求階乘。
答:
#!/bin/bash
#求階乘
#
if [ $# -eq 0 ]; then
echo "please input one integer"
exit
fi
func() {
if [ $1 -eq 0 ] || [ $1 -eq 1 ]; then
echo "1"
else
echo "$[$1*$[$1-1]]"
fi
}
func $1
[root@little ~]# ./30.sh 3
6
31、寫一個腳本,列出斐波那契數列。
答:
#!/bin/bash
#斐波那契
#
if [ $# -eq 0 ]; then
echo "please input one parameter"
exit
fi
fabonacci() {
if [ $1 -eq 0 ] || [ $1 -eq 1 ]; then
echo "1"
else
echo "$[$(fabonacci $[$1-1])+$(fabonacci $[$1-2])]"
fi
}
for I in $(seq 0 $1); do
fabonacci $I
done
[root@little ~]# ./31.sh 4
1
1
2
3
5
32、寫一個腳本,解決漢諾塔問題。
答:
#!/bin/bash
#漢諾塔問題
#
step=0
move() {
let step++
echo "$step: move disk $1 $2 ------> $3"
}
hanoi() {
if [ $1 -eq 1 ]; then
move $1 $2 $4
else
hanoi "$[$1-1]" $2 $4 $3
move $1 $2 $4
hanoi "$[$1-1]" $3 $2 $4
fi
}
hanoi $1 A B C
[root@little ~]# ./32.sh 4
1: move disk 1 A ------> B
2: move disk 2 A ------> C
3: move disk 1 B ------> C
4: move disk 3 A ------> B
5: move disk 1 C ------> A
6: move disk 2 C ------> B
7: move disk 1 A ------> B
8: move disk 4 A ------> C
9: move disk 1 B ------> C
10: move disk 2 B ------> A
11: move disk 1 C ------> A
12: move disk 3 B ------> C
13: move disk 1 A ------> B
14: move disk 2 A ------> C
15: move disk 1 B ------> C
33、寫一個腳本,利用任意循環結構,輸出每一行的第二個和第四個字符(以逗號分隔)。
文件為ling.txt為:
1,2,3,4,5
q,w,e,r,t
a,s,d,f,g
q,w,e,r,t
a,s,d,f,g
答:
#!/bin/bash
#查找指定列
#
while read LINES; do
echo -n "hello: "
echo $LINES | cut -d "," -f2,4 | tr "," " "
done < ling.txt
[root@little ~]# bash 33.sh
hello: 2 4
hello: w r
hello: s f
hello: w r
hello: s f
34、寫一個腳本實現下列功能
(1)、允許用戶通過命令行傳遞參數,實現用戶賬戶的管理
(2)、如果給出-a|--add選項,就創建該選項後面的用戶賬戶
(3)、如果給出-d|--del選項,就刪除該選項後面的用戶賬戶
(4)、如果用戶給出-v|--verbose選項,就顯示創建或刪除信息;
(5)、.如果用戶給出-h|--help選項,就顯示幫助信息,並且以0作為退出狀態碼退出腳本的運行;
(6)、如果用戶給出的其他選項,顯示幫助信息,並以5作為退出狀態碼退出腳本的運行
答:
#!/bin/bash
#添加刪除狀態
#
usage() {
echo "Usage: $(basename $0) -a|--add username1,username2... | -d|--del username1,username2..."
echo "option:"
echo -e "-a|--add\vCreate some users"
echo -e "-d|--del\vDelete some users"
echo -e "-h|--help\vDisplay help information"
}
adduser() {
addlist=$(echo $2 | tr "," " ")
for I in $addlist; do
if id $I &> /dev/null; then
echo "$I is exist already"
else
useradd $I
echo $I | passwd --stdin $I > /dev/null
echo "create $I successfully"
fi
done
}
deleteuser() {
dellist=$(echo $2 | tr "," " ")
for J in $dellist; do
if id $J &> /dev/null; then
userdel -r $J &> /dev/null
echo "delete $J already"
else
echo "$J is not exist"
fi
done
}
#main function
if [ $# -eq 0 ]; then
usage
exit 5
fi
case $1 in
-a|--add)
adduser $2
;;
-d|--del)
deleteuser $2
;;
-h|--help)
usage
exit 0
;;
*)
usage
exit
;;
esac
[root@little ~]# ./34.sh --help
Usage: 34.sh -a|--add username1,username2... | -d|--del username1,username2...
option:
-a|--add
Create some users
-d|--del
Delete some users
-h|--help
Display help information
35、寫一個腳本,給腳本傳遞幾個文件,選擇壓縮方式進行壓縮。
答:
#!/bin/bash
#歸檔壓縮
#
if [ $# -eq 0 ]; then
echo "Usage: $(basename $0) 請輸入歸檔壓縮文件: "
exit
fi
select I in gzip bzip2 xz; do
case $I in
gzip)
while true; do
tar -czf $1.tar.gz $1
shift
done
exit
;;
bzip2)
while true; do
tar -cjf $1.tar.bz2 $1
shift
done
exit
;;
xz)
while true; do
tar -cJf $1.tar.xz $1
shift
done
exit
;;
*)
echo "please input compression way: gzip|bzip2|xz"
exit
;;
esac
done
36、寫一個腳本,模擬Linux登錄界面:
(1)、將用戶名和密碼(明文即可)存放於/tmp/userinfo文件中,格式為username:password;
(2)、運行腳本後提示用戶輸入用戶名和密碼;
(3)、用戶輸入完成後,判斷用戶輸入的是否正確;
a)、如果輸入錯誤的用戶名,直接提示用戶重新輸入正確的用戶名;
b)、如果用戶名正確,密碼錯誤,提示用戶重新輸入密碼,三次連續輸錯,則讓用戶重新輸入用戶名。
答:
#!/bin/bash
#linux登錄界面
#
while true; do
read -p "please input your login name: " GET_NAME
if ! grep -q "^\<$GET_NAME\>" /tmp/userinfo; then
continue
fi
COUNT=0
until false; do
read -p "please input your login password: " GET_PASSWORD
PASSWORD=$(grep "$GET_NAME" /tmp/userinfo | cut -d: -f2)
if [ $GET_PASSWORD != $PASSWORD ]; then
let COUNT++
if [ $COUNT -eq 3 ]; then
break
fi
continue
else
break 2
fi
done
done
echo "login succussfully"
[root@little ~]# cat /tmp/userinfo
little:78
ling:23
[root@little ~]# bash 36.sh
please input your login name: ling
please input your login password: 23
37、寫一個腳本:
1) 顯示一個菜單給用戶:
d|D) show disk usages.
m|M) show memory usages.
s|S) show swap usages.
q|Q) quit.
2) 當用戶給定選項後顯示相應的內容;
3) 每次執行完成後不退出腳本,而是提示用戶可以繼續查看其它信息;直到用戶鍵入q、Q、quit或QUIT退出;
4) 如果用戶給出的不是菜單中可用的選項,則告訴用戶選項錯誤,需要重新選擇;
註意:cat實現菜單,後一個EOF前不能有空格,不然無法識別編輯結束。
答:
#!/bin/bash
#磁盤和內存使用情況
#
menu() {
cat << EOF
d|D) show disk usages
m|M) show memory usages
s|S) show swap usages
q|Q) quit.
EOF
}
while true; do
menu
read -p "please input your choice: " CHOICE
case $CHOICE in
d|D)
echo "---------------------------------------"
df -hT
echo "---------------------------------------"
continue
;;
m|M)
echo "---------------------------------------"
free -m | head -2
echo "---------------------------------------"
continue
;;
s|S)
echo "--------------------------------------"
free -m | head -1
free -m | tail -1
echo "---------------------------------------"
;;
q|Q|quit|QUIT)
break
;;
*)
echo "please input your choice"
continue
;;
esac
done
[root@little ~]# bash 37.sh
d|D) show disk usages
m|M) show memory usages
s|S) show swap usages
q|Q) quit.
please input your choice: m
---------------------------------------
total used free shared buffers cached
Mem: 475 461 13 2 25 135
---------------------------------------
d|D) show disk usages
m|M) show memory usages
s|S) show swap usages
q|Q) quit.
please input your choice: d
---------------------------------------
Filesystem Type Size Used Avail Use% Mounted on
/dev/sda2 ext4 50G 5.6G 42G 12% /
tmpfs tmpfs 238M 224K 238M 1% /dev/shm
/dev/sda1 ext4 190M 36M 145M 20% /boot
/dev/sr0 iso9660 3.7G 3.7G 0 100% /media/CentOS_6.7_Final
---------------------------------------
d|D) show disk usages
m|M) show memory usages
s|S) show swap usages
q|Q) quit.
please input your choice: q
38、寫一個腳本:向每個默認shell為bash且uid與gid相等的用戶問候母親節快樂,格式如下:"Hi USERNAME, Happy mother‘s Day!"。
答:
#!/bin/bash
#UID和gid相同的用戶
#
bashuser=$(grep "bash$" /etc/passwd | cut -d ":" -f1)
for I in $bashuser; do
if [ $(id -u $I) -eq $(id -g $1) ]; then
echo "Hello $I, happy mother‘s day"
fi
done
[root@little ~]# ./38.sh
Hello root, happy mother‘s day
腳本1-38