1. 基础
1、帮助信息 wc --help
2、#此处是注释代码
3、脚本首行 #!/bin/sh
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$# 传递给脚本或函数的参数个数。
exit; //终止脚本执行
转义符号
2. 变量 (不要空格)
声明: i=1
使用: $i / ${i}
2.2 获取、设置环境变量
echo $LANG
2.3 Shell特殊变量
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$? 上个命令的退出状态,或函数的返回值。一般情况下,大部分命令执行成功会返回 0,失败返回 1。
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
3. 数组和循环
声明: array=(element1 element2 element3 .... elementN) //()括起来 空格分开
读取: #echo ${array[0]}
遍历: ${array[@]}
循环: (1) for data in ${array[@]}
do
echo ${data}
done
(2) 可用标准的for循环
(3) for shname in `ls *.sh`
(4) while循环
i=1
while(($i<100))
4. if 分支
4.1 示例
// 必须注意 if中的空格
g_SFTP_AUTH_LLD=$(cat $cfg_name|grep "^OS_AUTH_MODE=" |awk -F '=' '{print $2}')
if [ ! -z "$1" ]; then
generate_elb_config
fi
if [ "$g_SFTP_AUTH_LLD" == "" ];then
g_SFTP_AUTH=$(cat $cfg_name|grep "^SFTP_AUTH_METHOD=" |awk -F '=' '{print $2}')
else
g_SFTP_AUTH=$g_SFTP_AUTH_LLD
fi
4.2 条件表达式
if [ -f file ] 如果文件存在
if [ ! -f file ] 如果文件不存在
if [ -d ... ] 如果目录存在
if [ -s file ] 如果文件存在且非空
if [ -r file ] 如果文件存在且可读
if [ -w file ] 如果文件存在且可写
if [ -x file ] 如果文件存在且可执行
if [ int1 -eq int2 ] 如果int1等于int2
if [ int1 -ne int2 ] 如果不等于
if [ int1 -ge int2 ] 如果>=
if [ int1 -gt int2 ] 如果>
if [ int1 -le int2 ] 如果<=
if [ int1 -lt int2 ] 如果<
if [ -z STRING ] “STRING” 的长度为零则为真。
if [ STRING ] “STRING” 的长度为非零 non-zero则为真。 //注, [ -n STRING ] 此种判断有误
5. 定义函数
function getBinFlag()
{
isBinWithI=`lsattr -d /home/huawei/mdn2000/cmi/bin`
echo $binIFlag > /tmp/cmi_update_bin_flag.ini
}
5.1 待参数的函数
funtion printName(){
echo $1 //输出值aa
}
printName aa bb
printName $@ //$@--表示全部参数
6. 字符串处理
//连接字符串:
var3=${var1}${var2}
catalinafilename="catalina.sh"$datetime
6.1 字符串判空
#!/bin/sh
STRING=
if [ -z "$STRING" ]; then
echo "STRING is empty"
fi
if [ -n "$STRING" ]; then
echo "STRING is not empty"
fi
6.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/dir/path}:将第一个dir 替换为path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部dir 替换为 path:/path1/path2/path3/my.file.txt
//记忆方法如下
# 是 去掉左边(键盘上#在 $ 的左边)
%是去掉右边(键盘上% 在$ 的右边)
单一符号是最小匹配;两个符号是最大匹配
${file:0:5}:提取最左边的 5 个字节:/dir1
${file:5:5}:提取第 5 个字节右边的连续5个字节:/dir2
7. 获取时间
//将当前时间赋给变量--20171214215436
datetime=$(date +%Y%m%d%H%M%S)
获取明天的日期 date -d next-day +%Y%m%d
获取昨天的日期 date -d last-day +%Y%m%d
获取上个月的年和月 date -d last-month +%Y%m
获取下个月的年和月date -d next-month +%Y%m
获取明年的年份date -d next-year +%Y
% : 印出
% %n : 下一行
%t : 跳格
%H : 小时(00..23)
%I : 小时(01..12)
%k : 小时(0..23)
%l : 小时(1..12)
%M : 分钟(00..59)
%p : 显示本地 AM 或 PM
%r : 直接显示时间 (12 小时制,格式为 hh:mm:ss [AP]M)
%s : 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数 %S : 秒(00..61)
%T : 直接显示时间 (24 小时制)
%X : 相当于 %H:%M:%S
%Z : 显示时区
日期方面 :
%a : 星期几 (Sun..Sat)
%A : 星期几 (Sunday..Saturday)
%b : 月份 (Jan..Dec)
%B : 月份 (January..December)
%c : 直接显示日期和时间
%d : 日 (01..31)
%D : 直接显示日期 (mm/dd/yy)
%h : 同 %b
%j : 一年中的第几天 (001..366)
%m : 月份 (01..12)
%U : 一年中的第几周 (00..53) (以 Sunday 为一周的第一天的情形)
%w : 一周中的第几天 (0..6)
%W : 一年中的第几周 (00..53) (以 Monday 为一周的第一天的情形)
%x : 直接显示日期 (mm/dd/yy)
%y : 年份的最后两位数字 (00.99)
%Y : 完整年份 (0000..9999)
14、 eval命令
test.txt内容:hello shell world!
myfile="cat test.txt"
(1)echo $myfile #result:cat test.txt
(2)eval echo $myfile #result:hello shell world!
从(2)可以知道第一次扫描进行了变量替换,第二次扫描执行了该字符串中所包含的命令
15、其它命令
15.1 shift-脚本参数位移
//shift(shift 1) 命令每执行一次,变量的个数($#)减一(之前的$1变量被销毁,之后的$2就变成了$1),而变量值提前一位。同理,shift n后,前n位参数都会被销毁
#!/bin/bash
echo "参数个数为:$#,其中:"
for i in $(seq 1 $#)
do
eval j=$$i
echo "第$i个参数($"$i"):$j"
done
shift 3
echo "执行shift 3操作后:"
echo "参数个数为:$#,其中:"
for i in $(seq 1 $#)
do
#通过eval把i变量的值($i)作为变量j的名字
eval j=$$i
echo "第$i个参数($"$i"):$j"
done
//结果
参数个数为:5,其中:
第1个参数($1):a
第2个参数($2):b
第3个参数($3):c
第4个参数($4):d
第5个参数($5):e
执行shift 3操作后:
参数个数为:2,其中:
第1个参数($1):d
第2个参数($2):e