文件名: 目錄的內容稱為目錄項,目錄項包含了文件名,只有兩個字元不允許出現在檔案名稱中:斜杠,空字元(ASCII 值為0),斜線用於分隔路徑中的檔案名,空字元用來表示路徑的結尾。檔案名稱的長度通常可以達到255個字元
路徑: 一系列檔案名稱連起來,用斜線分隔,就叫做路徑,路徑用來表示檔案的位置;以斜線開頭的路徑叫做絕對路徑,否則為相對路徑,相對路徑相對於目前工作目錄
回傳碼:所有指令都有一個回傳值,用0-255之間的整數來表示;腳本就是一個指令,它也有回傳值,另外,腳本裡面的函數也有回傳值
退出腳本的正規方法是明確地用指令exit [code]來退出,如:exit 0;exit $?
二、read
1、定義
1、定義
賦值,類似C語言中的scanf;其不僅可以賦值變量,還可以賦值數組;
其輸入不僅是屏幕,還可以是文件描述符
2、實操
#
# read -輸入字串,將字串賦值給變數a;# echo $a
hello world!!
# read name sex age --同時分別給三個變數賦值,輸入分隔符號預設為空格符
zhangsan male 50
# unset name sex age --刪除變數
# IFS=';' --將read 的輸入分隔符號改為';'
# vim test.sh
#!/bin/bash
# vim test.sh
#!/bin/bash
prompt="Please enter your name:"read -p "$prompt" name
echo "Greetings $name"
、運算元、運算工具
echo $((1+2**2-3*4/5%6)) --輸出計算結果到螢幕
# a=$((1+2**2-3*4/5%6) ) --把計算結果賦給變數a
# ((a=1+2**2-3*4/5%6)) --同上
# echo "scale=3;10/3" | bc --bc計算機;保留小數點後三位
# echo "2^10" | bc --bc計算器;計算2的10次方
# awk 'BEGIN{print 1/3}' -- awk計算
2、取得隨機數
# od -N4 -tu4 /dev/urandom | sed -n '1s/.* //p' --取得7位數的號碼
# od - Ad -w24 -tu4 /dev/urandom --取得隨機數
🎜# od -tu8 /dev/urandom --取得隨機數🎜
# od -tu8 /dev/urandom | sed -r 's/^[0-9]+s+//' | sed -r 's/s+/n/g' |cut -b1-8 |sed -r -n '/^.{8}$/p' | sed 's/^/186/' |head -n5000 |vi - --取得一萬個電話號碼
# od -N40000 -tu4 /dev/urandom | sed -r 's/^[0-9]+(s+)?//' | sed -r 's/s+/n/g' | grep -vE '^s*$' > 10k_random --生成一萬個隨機數
# sed -r -n '/^.{8}$/p' 10k_random | head -n 100000 | sed 's/^/186/' > phone_num
3、取得數字序列3、取得數字序列
3、取得數字序列
3、取得數字序列
3、取得數字序列
3、取得數字序列
3、取得數字序列
3、取得數字序列
3、取得數字序列
3、取得數字序列
3、取得數字序列
3、取得數字序列
3、取得數字序列
3、取得數字序列3、取得數字序列3、取得數字序列
3、取得數字序列
3、取得數字序列3、取得數字序列3、取得數字序列
3、取得數字序列
3、取得數字序列
3、求數字
# seq 10 --取得1到10
# seq 1 2 10 --取得1到10,步長為2
# seq 10 100 -- 取得10到100
# seq 10 100 -- 取得10到100
#1 se7 -倒序,10到1
四、if/then實例
1、判斷字元"a" 是否等於"A"
# vim test字元"a" 是否等於"A"
# vim test.sh.sh.
if [[ "a" = "A" ]]; then
if [ "a" = "A" ]; then
echo "a equs"
echo "a equa" equals A"
fi
2、判斷/root/test/test.sh是否存在並具有可執行權限
# vim test.sh
#!/bin/bash
# vim test.sh
#!/bin/bash -
/root/test/test.sh;then
echo "/root/test/test.sh is executable"
fi
🎜🎜🎜3、核對系統是否存在它是否存在測試系統是否存在詞🎜🎜#!/bin/bash🎜🎜🎜if grep -E --color=auto ^root: /etc/passwd; then🎜🎜🎜 echo "user root exists"🎜🎜 『echo "user root exists"🎜🎜🎜🎜🎜 🎜🎜# vim test.sh🎜🎜#!/bin/bash🎜🎜function isSymbolicLink() {🎜
file=$1
flag=$(ls -ld $file | cut -b1)
test "$flag" = "1"
}$1. isSymbolicLink $ file; then
echo "Symbolic Link"
elif test -d $file; then
echo "Directory file"elif test -
elif test - b $file; then
echo "Block special"
elif test -c $file; then
echo "Character special"
『 test -S $file; then
echo "Socket"
else
echo "Unkown"
fi
5.
num=$1
if test "$num" -lt 10 ;then
echo "小數字"
elif test "$num" -lt 20then🜀 test
『 $num" -lt 30;then
echo "大數字"
else
echo "超大數字"fi
.
# vim test.sh
#!/bin/bash
echo -n "Enter a number: "
read num
if [ "$num" -lt 100 ]; then
echo "小於100"
elif [ "$num" -ge 100 -a "$num" -lt 200 ]; then
小於200"
elif [ "$num" -ge 200 -a "$num" -lt 300 ]; then
echo "大於等於200小於300"
else
echo "其它數字"
else
五、wihle循環
1、認識
測試while 關鍵字後面一條指令的回傳碼,條件為真時,程式讀入while循環體中的指令
0為真時,程式讀入while循環體中的指令0為真。循環體如下:
while [] --while 後面運行[ ] 指令,測試[ ] 指令的回傳碼
cat /filename | while read line 回傳碼
do
......
done
2、循環控制語句
continue --終止當前循環,開始下一個循環控制語句
continue --終止當前循環,開始下一個循環控制語句
continueue循環體3、實例exit --終止當前腳本
3、實例
# vim test.sh
--區分continue 與break 的區別
#!/bin/bash
sleep 1
echo test
continue/break
echo
done
# vim test。 - e /data/test/test.sh
doecho "exists"
sleep 1
break/exit
done
echo "loop end"
# vim test.shecho "loop end"
# vim testtest.sh.sh. #!/bin/bash
if test $# -ne 1;then
echo "wrong paraneter" >&2
exit
fi
path=$1
exit
fi
path=$1
do
sleep 1
echo "don't found!!!"
done
echo "found"
# vim test.sh --腳本運行指定的時間,時間一到就退出;單位s
if test $# -ne 1;then
echo "Usage: $(basename $0) TIME" >&2
exit 1
beginTime=$(date +%s)
endTime=$(( $beginTime + $timeLength ))
------------------------- --------------------------------
while test $(date +%s) -lt "$endTime"
do
echo "processing....."
sleep 1
done
---------------------------- -----------------------------
while true
do
if test $(date +%s) -ge " $endTime";then
break
fi
echo "processing....."
sleep 1
done
------------------------------------------------- --------
echo "time out"
# vim test.sh --循環讀取檔案的每一行,併計算每行的字元數
#!/bin/bash
file=$1
------------------------------------------- --------------
totalLines=$(wc -l
line=1
while test $line -le $totalLines
do
lineData=$ (sed -n "${line}p" $file)
len=$(echo -n $lineData | wc -c)
echo "line ${line}: $len"
line=$(( $line + 1 ))
done
--------------------------------------- ------------------
line=1
while read lineData
do
len=$(echo $lineData | wc -c)
echo "line ${line}: $len"
line=$(( $line + 1 ))
done
----------------- ----------------------------------------
# vim test.sh --列印出10行hello world;
#!/bin/bash
while read num
do
echo "h world" done
---------------------------------------- -----------------
n=1
while [ $n -le 10 ]
do
echo "hello world"
n=$( (n+1))
done
--------------------------------------- ------------------
# vim test.sh --建立一個不盡的循環,要求循環運作1分鐘後自動終止
#!/bin/bash
start_time=$(date +%s)
while true do
cur_time=$(date +%s)
test $((cur_time - start_time)) -ge 10 && break
time=$((cur_time - start_time))
time=$((cur_time - start_time))
time=$((cur_time - start_time))
...."
sleep 1done
# vim test.sh
--先用while 循環建立100個.txt檔案;再將所有檔案後綴名為.html
#!/bin /bash
count=100----------------------------------------- ----------------
seq $count | while read i
do
touch ${i}.txtdone
ls -1 *. txt | while read oldname
do
newname=$(echo $oldname | sed 's/.txt$/.html/')
mv $oldname $newname
done
mv $oldname $newname
done
done---- -------------------------------------------------- -
while read i
do
touch ${i}.txt
done
while read oldname
s/.txt$/.html/')mv $oldname $newname
done
# vim test.sh
--計算出1000 之內的偶數的和;不能使用管道,因為管道會產生子進程
#!/bin/bash
sum=0
🎜while read num🎜🎜do🎜
sum=$(( $sum + $num ))
done
echo "sum: $sum "
# vim test.sh --批量添加100個郵件用戶,批量添加100個郵件用戶,批量添加100個郵件用戶,批量添加100個郵件使用者名稱為u1 至u100,密碼為abc,登入shell 為/sbin/nologin,只屬於email群組
#!/bin/bash
password=abc
group=email
password=abc
group=email
{group}:" /etc/group || groupadd $group
while read i
do
useradd u${i} -N -g $group -s /sbin/nologin
passwd u${i} --stdin done
# vim test.sh
--批次刪除剛建立的100個郵件使用者
#!/bin/bash
read i
do
userdel -r u${i}
done
六、for 循環
六、for 循環
次取其中之一,當取完之後,循環結束
每次取出的字串會被保存在一個變數中,可以在循環體內使用該變數
由分隔符號隔開的字串可以透過以下方法提供:
1、手動輸入字串,用於循環指定次數
# vim test.sh
#!/bin/bash
for i in 1 2 3
i
don
2、由變數提供字串
# vim test.sh
#!/bin/bash
FILES="/bin/bash /bin/ls /bin/cat"
for file in $FILES
do🎜🎜echo $file🎜
done
3、程式產生的字串
# vim test.sh
#!/bin/bash
for n in $(seq 11) done
4、由shell 展開而生成,循環目錄中的檔案
# vim test.sh
#!/bin/bash
for f in /etc/init.d/etc/init. do
echo $f
done
# vim test.sh
5、列印出/dev 下面所有以loop 開頭的檔案的檔案名稱
#sh# v. bash
for file in /dev/loop*
do
echo $(basename $file)done
6、計算出1000 之內的偶數的和碼數#!/bin/bash
sum=0
for number in $(seq 2 2 998)
do
sum=$(( $sum + $number ))
sum=$(( $sum + $number ))
㜎sum"
7、批量添加100個郵件用戶,用戶名為u1 至u10,密碼為abc,登入shell 為/sbin/nologin,只屬於email群組
# vim test.sh
#!/ bin/bash
function checkGid() {
gid=$1
if ! grep -qE "^$gid:" /etc/group; then
add $gid🜥 ) {
id=$(id | awk -F "[=(]" '{print $2}')
if test "$id" -ne 0; then
echo "must be root" >&2
exit 1
fi
}
count=10
namePrefix=u
password=abc
shell=/sbin/nologin
password=abc
shell=/sbin/nologin
num in $(seq $count)
do
name=${namePrefix}${num}
useradd $name -s $shell -g $gid &> /dev/null
if test $? -ne 0 then
; then
echo "failed to create $name" >&2
else
echo "created successfully -- $name"
echo "$password" | passwd --stdin $name &> /dev/null
-ne 0; then
echo "failed to change password for $name" >&2
else
echo "password changed successfully -- $name"
fi
內所有電腦的IP 與MAC 位址的對應表
# vim test.sh
#!/bin/bash
ipPrefix=192.168.1.
startIp=1Prefix=192.168.1. $(seq $startIp $endIp)
do
ip=${ipPrefix}$num
ping -W1 -c1 $ip &>/dev/null &
done
wa '/incomplete/d' | awk '{print $1,$3}'| cat | sort -n -t '.' -k4,4 | column -t
9、印出九九乘法表
# vim test.sh
#!/bin/bash
for row in $(seq 9)
doo
do
echo -n "${col}x${row}=$(( $col * $row )) "
done
echo
done | column -t
echodone | column -t
器
#!/bin/bash
varnum=3
if test "$#" -ne "$varnum"; then
echo "wrong argument" >&2
1 =$1
num2=$3
operator=$2
if test "$operator" = "x";then
operator="*"
fi
"$num2" = 0; then
echo "division by 0" >& 2
exit 1
fi
result=$(( $num1 $operator $num2 ))
result=$(( $num1 $operator $num2 ))
result=$(( $numecho"$
注意:乘法的處理;被除數為0時的處理
11、把指定目錄下的某些檔案複製到指定的目錄,要求:
#1. 從命令列參數接收兩個參數,分別是來源目錄和目標目錄
#2. 如果來源目錄不存在,應該報錯
#3. 如果目標目錄不存在,就建立一個
#4. 如果目標已經存在但不是目錄,就報錯
#5. 只複製常規文件,軟連結文件
#6. 對於常規文件,只複製大小小於1M 的文件
# vim /test.sh
#!/bin/bash
function displayHelp()
{
echo "用法:$(basename $0) SRCDIR DSTDIR"
}
function getSize()
}
function getSize()
}
function getSize()
=$s | awk '{print $5}')
echo $size
}
if test $# -ne 2;然後
顯示幫助>&2
退出1
顯示幫助>&2
退出1
顯示幫助>&2
退出1
顯示幫助>&2
退出1
顯示幫助>&2
$2
如果測試! -d“$srcdir”;然後
echo "$srcdir 不存在或不是目錄" >&2
退出 1
fi
如果測試! -e "$dstdir";然後
mkdir "$dstdir"
fi
如果測試! -d「$dstdir」;然後
echo "$dstdir 不是目錄" >&2
exit 1
fi
for $srcdir/*
do a $file $dstdir/
elif test -f $file;然後
-------------------------------- ---------------------------- ----
size=$(getSize $file)
if test "$size" -lt 1048576;然後🎜🎜cp -a $file $dstdir/🎜🎜fi🎜🎜------------------------------ ------------------ -----------------🎜🎜find $file -type f -size -1024k -exec cp -a {} $dstdir/ ;🎜🎜-------- -------------------------------- -----------🎜🎜fi🎜
完成