Shell基础
系统变量
- 位置参数的值可以用 $N 得到,第 0 号为程序名字,从 1 开始就表示传递给程序的参数。如 $0 表示程序的名字,$1 表示传递给程序的第一个参数,以此类推。
- $0 : 程序的完整路径和名字。
- $# : 总的参数数目。
- $? : 前一个问题的返回码。正常退出返回 0,反之为非 0 值。
- $* : 传递给程序的所有参数组成的字符串。
if 语句
if test $1 -eq 0; then
echo "if"
elif [ $1 -eq 1 ] then
echo "elif"
else
echo "else"
fi
赋值语句
注意:等号(=)前后没有空格
x=26
x=$x+1
s="How old are you?"
echo $s+"I am "+$x
读入语句
read str
echo $str
计算表达式
注意:乘号(*) 需要转义(加’\’)
read x,y
z=`expr$x+$y`
echo $z
z=`expr$x\*$y`
echo $z
返回码
注意:‘[’后面和 ‘]’前面及等号‘=’的前后都应有一个空格
read str1, str2
[ "$str1" = "$str2" ]
echo $?
字符串长度
[ -n "$str1" ] # length > 0 ?
[ -z "$str2" ] # length = 0 ?
比较符
-eq # == equal
-ge # >= greater than and equal
-le # <= less than and equal
-ne # != not equal
-gt # > greater than
-lt # < less than
逻辑运算符
-a # && and
-o # || or
文件操作符
-d # directory
-f # file
-L # symbol link
-r # readable
-w # writeable
-x # executive
-s # length != 0
循环语句
在循环列表中的空格表示换行
input : a,b,c,e,I 2,4,6,8
output : a,b,c,e,I
2,4,6,8
# for each
for i in $str1
do
echo $i
done
# for
for((j=1;j<=100;j++))
do
echo $j
done
# while
while (())
do
pass
done
# do
until (())
do
pass
done
switch语句
case $str1 in
"a"|"b")
pass;;
"c")
pass;;
*) # else
pass;;
esac
常用操作
1. 提取文件名和目录名的一些方法
分割字符串方式
1.1 返回左起最后一个‘/’(不含)右边的内容
var=/dir1/dir2/file.tar.gz
${var##*/} # file.tar.gz
1.2 返回左起最后一个‘.’(不含)右边的内容
var=/dir1/dir2/file.tar.gz
${var##*.} # gz
1.3 返回左起第一个‘.’(不含)右边的内容
var=/dir1/dir2/file.tar.gz
${var#*.} # tar.gz
var=/dir1/dir2.d/file.txt
${var#*.} # d/file.txt
1.4 返回右起第一个‘/’(不含)左边的内容
var=/dir1/dir2/file.tar.gz
${var%/*} # /dir1/dir2
1.5 返回右起最后一个‘.’(不含)左边的内容
var=/dir1/dir2/file.tar.gz
${var%%.*} # /dir1/dir2/file.tar
总结:
#:左起第一个
%:右起第一个
##:左起最后一个
%%:右起最后一个
*:表示要删除的内容,位于字符(例子中的’/’和’.’)左边,删除字符及其左边的内容,右边同理
命令方式
1.6 文件名 basename 路径 [后缀]
$(basename /dir1/dir2/file.txt) # file.txt
$(basename /dir1/dir2/file.txt .txt) # file
1.7 目录名 dirname 路径
$(dirname /dir1/dir2/) # dir1