shell 常用笔记
.当前目录 .. 上级目录 ~用户根目录(/home/lzm)
文件状态测试
-d 目录 -s 文件长度大于0
-f 正规文件 -w 可写
-L 符号连接 -u 文件有suid位设置
-r 可读 -x 可执行
[ -d test.sh ](两边加上空格) = test -d test.sh
特定shell变量
$0 表示脚本名字,$1表示第一个参数......$9表示第九个参数
$# 参数个数
$* 用一个字符串显示所有参数
$$ 脚本运行的当前进程ID
$! 后台运行的最后一个进程的进程ID
$@ 与$*相同,每个参数作为独立的字符串
$- 显示shell的当前选项,与set命令相同
$? 显示shell命令的退出状态,0表示无错误,其他表示有错
引号
双引号("") 其中引用的变量会替换为变量值
STR="Hello world" echo "$STR" Hello world
单引号('') 忽略变量和其他特殊字符,单引号内任何内容都当成字符串显示
STR="Hello world" echo '$STR' $STR
反引号(``) 反引号中的内容被当做命令来执行
VAR=`date` echo $VAR Thu Dec 22 22:08:07 JST 2011
字符串测试 [ string1 string_operator string2 ] 或者 [ string_operator string ]
string_operator可为: = 两个字符串相等
!= 两个字符串不等
-z 空串
-n 非空串
数值测试 [ "number1" num_operator "number2" ]
num_operator可为: -eq 数值相等
-ne 数值不等
-gt number1 > number2
-lt number1 < number2
-le number1 <= number2
-ge number1 >= number2
控制流结构
if语句格式
if 条件1
then
执行命令1
elif 条件2
then
执行命令2
else
执行命令3
fi
case语句格式
case 值 in
模式1)
命令1
;;
模式2)
命令2
;;
......
easc
其中的“模式”可以是 *(任意字符), ?(任意单字符), [..](范围内任意字符)
“模式”中还可以是使用 | (比如 str1|str2 表示str1和str2都可以)
for语句格式
for 变量名 in 列表
do
命令1
命令2 ......
done
until语句格式
until 条件
命令1
......
done
一直执行至条件为真时才结束,至少执行一次
while语句格式
while 条件
命令1
......
done
利用IFS来改变读取内容的分隔符
利用break和continue控制循环的执行
Shell函数
shell函数格式
函数名 ()
{
命令1
......
}
或者
function 函数名 ()
{
命令1
......
}
引用其他脚本中函数 . /pathname/funcfile (<点><空格><斜线><文件完整路径名>或者<点><空格><文件相对路径名>)
函数中通过 $1, $2,......$9来获取参数
脚本传递参数
使用shift依次获取各个参数,比如
while [ $# -ne 0 ]
do
echo $1 # 通过shift,$1将依次表示各个参数
shift
done
getopts语法格式 getopts operation-string variable。
.当前目录 .. 上级目录 ~用户根目录(/home/lzm)
文件状态测试
-d 目录 -s 文件长度大于0
-f 正规文件 -w 可写
-L 符号连接 -u 文件有suid位设置
-r 可读 -x 可执行
[ -d test.sh ](两边加上空格) = test -d test.sh
特定shell变量
$0 表示脚本名字,$1表示第一个参数......$9表示第九个参数
$# 参数个数
$* 用一个字符串显示所有参数
$$ 脚本运行的当前进程ID
$! 后台运行的最后一个进程的进程ID
$@ 与$*相同,每个参数作为独立的字符串
$- 显示shell的当前选项,与set命令相同
$? 显示shell命令的退出状态,0表示无错误,其他表示有错
引号
双引号("") 其中引用的变量会替换为变量值
STR="Hello world" echo "$STR" Hello world
单引号('') 忽略变量和其他特殊字符,单引号内任何内容都当成字符串显示
STR="Hello world" echo '$STR' $STR
反引号(``) 反引号中的内容被当做命令来执行
VAR=`date` echo $VAR Thu Dec 22 22:08:07 JST 2011
字符串测试 [ string1 string_operator string2 ] 或者 [ string_operator string ]
string_operator可为: = 两个字符串相等
!= 两个字符串不等
-z 空串
-n 非空串
数值测试 [ "number1" num_operator "number2" ]
num_operator可为: -eq 数值相等
-ne 数值不等
-gt number1 > number2
-lt number1 < number2
-le number1 <= number2
-ge number1 >= number2
控制流结构
if语句格式
if 条件1
then
执行命令1
elif 条件2
then
执行命令2
else
执行命令3
fi
case语句格式
case 值 in
模式1)
命令1
;;
模式2)
命令2
;;
......
easc
其中的“模式”可以是 *(任意字符), ?(任意单字符), [..](范围内任意字符)
“模式”中还可以是使用 | (比如 str1|str2 表示str1和str2都可以)
for语句格式
for 变量名 in 列表
do
命令1
命令2 ......
done
until语句格式
until 条件
命令1
......
done
一直执行至条件为真时才结束,至少执行一次
while语句格式
while 条件
命令1
......
done
利用IFS来改变读取内容的分隔符
利用break和continue控制循环的执行
Shell函数
shell函数格式
函数名 ()
{
命令1
......
}
或者
function 函数名 ()
{
命令1
......
}
引用其他脚本中函数 . /pathname/funcfile (<点><空格><斜线><文件完整路径名>或者<点><空格><文件相对路径名>)
函数中通过 $1, $2,......$9来获取参数
脚本传递参数
使用shift依次获取各个参数,比如
while [ $# -ne 0 ]
do
echo $1 # 通过shift,$1将依次表示各个参数
shift
done
getopts语法格式 getopts operation-string variable。