1. 程式人生 > >腳本1-38

腳本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