内置1
$# 是传给脚本的参数个数
$0 是脚本本身的名字
$1 是传递给该shell脚本的第一个参数
$2 是传递给该shell脚本的第二个参数
$@ 是传给脚本的所有参数的列表
$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过9个
$$ 是脚本运行的当前进程ID号
$? 是显示最后命令的退出状态,0表示没有错误,其他表示有错误
$! 是Shell最后运行的后台Process的PID
cat a.sh
echo "number:$#"
echo "scname:$0"
echo "first :$1"
echo "second:$2"
echo "argume:$@"
echo "show parm list:$*"
echo "show process id:$$"
echo "show precomm stat: $?"
echo "show last precomm stat: $!"
./a.sh 1 2 3 4 5 6 7 8 9 10 11 12
number:12
scname:./a.sh
first :1
second:2
argume:1 2 3 4 5 6 7 8 9 10 11 12
show parm list:1 2 3 4 5 6 7 8 9 10 11 12
show process id:2134
show precomm stat: 0
show last precomm stat: 0
内置2
source exec .
source 是在原进程中执行,环境变量改变影响本身
. 是fork一个进程,运行和原进程无关
exec 是将原进程结束掉,开始新的进程。
{cmd1;cmd2;cmd3;} 是代码块,还是同一进程。
(cmd1 ) & 开启一个新的进程,且后台执行,提高并发
若所作的修改是临时的,且不想影响只会的设定那就()nested sub-shell
${}
1. 用来区分变量a=1 echo ${a}b
2. 操作
file=/dir1/dir2/dir3/my.file.txt
我們可以用 ${ } 分別替換獲得不同的值:
${file#*/}:拿掉第一條 / 及其左邊的字串:dir1/dir2/dir3/my.file.txt
${file##*/}:拿掉最後一條 / 及其左邊的字串:my.file.txt
${file#*.}:拿掉第一個 . 及其左邊的字串:file.txt
${file##*.}:拿掉最後一個 . 及其左邊的字串:txt
${file%/*}:拿掉最後條 / 及其右邊的字串:/dir1/dir2/dir3
${file%%/*}:拿掉第一條 / 及其右邊的字串:(空值)
${file%.*}:拿掉最後一個 . 及其右邊的字串:/dir1/dir2/dir3/my.file
${file%%.*}:拿掉第一個 . 及其右邊的字串:/dir1/dir2/dir3/my
記憶的方法為:
# 是去掉左邊(在鑑盤上 # 在 $ 之左邊)
% 是去掉右邊(在鑑盤上 % 在 $ 之右邊)
單一符號是最小匹配﹔兩個符號是最大匹配。
${file:0:5}:提取最左邊的 5 個字節:/dir1
${file:5:5}:提取第 5 個字節右邊的連續 5 個字節:/dir2
我們也可以對變量值裡的字串作替換:
${file/dir/path}:將第一個 dir 提換為 path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:將全部 dir 提換為 path:/path1/path2/path3/my.file.txt
利用 ${ } 還可針對不同的變數狀態賦值(沒設定、空值、非空值):
${file-my.file.txt} :假如 $file 沒有設定,則使用 my.file.txt 作傳回值。(空值及非空值時不作處理)
${file:-my.file.txt} :假如 $file 沒有設定或為空值,則使用 my.file.txt 作傳回值。 (非空值時不作處理)
${file+my.file.txt} :假如 $file 設為空值或非空值,均使用 my.file.txt 作傳回值。(沒設定時不作處理)
${file:+my.file.txt} :若 $file 為非空值,則使用 my.file.txt 作傳回值。 (沒設定及空值時不作處理)
${file=my.file.txt} :若 $file 沒設定,則使用 my.file.txt 作傳回值,同時將 $file 賦值為 my.file.txt 。 (空值及非空值時不作處理)
${file:=my.file.txt} :若 $file 沒設定或為空值,則使用 my.file.txt 作傳回值,同時將 $file 賦值為 my.file.txt 。 (非空值時不作處理)
${file?my.file.txt} :若 $file 沒設定,則將 my.file.txt 輸出至 STDERR。 (空值及非空值時不作處理)
${file:?my.file.txt} :若 $file 沒設定或為空值,則將 my.file.txt 輸出至 STDERR。 (非空值時不作處理)
${#var} 可計算出變量值的長度:
${#file} 可得到 27
$() 等价于` `
用来做命令替换 ls -l $(which vim)
$(())
用来做算术运算
#获得所有文件
for f in *
do
echo $f
done
for lst in list
do
echo $lst
done
for((i=0;i<;i++))
do
echo $i
done
-a file :file 存在
-d file :file存在并是一个目录
-e file :file 存在,同- a
-f file :file 存在并且是一个常规的文件(不是目录或者其他特殊类型文件)
-r file :有读的权限
-s file :文件存在且不为空
-w file :有写的权限
-x file :有执行的权限,或者对于目录有search的权限
-N file :在上次读取后,文件有改动
-O file :own所属的文件
-G file :group所属的文件
file1 -nt file2 :file1 比 file2 更新,以最后更新时间为准
file1 -ot file2 :file1 比 file2 更旧 ,以最后更新时间为准
>或者<或者=是用于字符串的比较,如果用于整数比较,使用:
-lt,小于
-le,小于等于
-eq,等于
-ge,大于等于
-gt,大于
-ne,不等于
字符串比较是放置在[...]中,有以下的几种:
str1 = str2,字符串1匹配字符串2
str1 != str2,字符串1不匹配字符串2
str1 > str2,字符串1大于字符串2
str1 < str2,字符串1小于字符串2
-n str,字符串不为null,长度大于零
-z str,字符串为null,长度为零
if [ -n "$dirname" ] &&[ -d "$dirname" ]
then
cd $dirname
mystack="$dirname ${mystack:-$OLDPWD }"
echo $mystack
else
echo still in $PWD.
fi