###
shell脚本(本文以Bash为基础)
要特别注意空格!!!
shell一般用于数据的导入导出、文本传输、作业调度
只有单行注释
shell大多数命令可以直接在linux内运行
在shell脚本中写入代码时要先写入 #!/bin/bash
#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序
一、变量
1 定义变量
1.1 直接赋值
shell脚本中没有数据类型的概念(可都看作字符串类型)
var_n=v_ar #等号左右不能有空格
readonly st_r#只读 【了解】
1.2 `` 赋值
var_n=`c_md`
#将命令结果赋值给变量
#如果命令结果为多行,则 赋值给变量后 用空格分开 放在同一行
2 命名规则
命名只能使用英文字母,数字和下划线
字符不能以数字开头,但可以用下划线
大小写敏感
中间不能有空格
不能使用标点符号
不能使用bash里的关键字(可用help命令查看保留关键字)
3 字符串操作
$s_tr1 $s_tr #拼接 写在一起即可
${#s_tr} #长度
${s_tr:i_ndex:n_um} #截取 起始位置加长度
${$s_tr//old_str/new_str} #替换
#没有的操作:位置
''和""
放在""中的变量可被识别解析
放在''中的变量只能原样输出
"${s_tr1}str_2" #${s_tr1}保证了只调用s_tr1变量
4 参数传递
4.1 文件参数传递
执行sh文件时输入
./sh_n.sh par_n1 par_n2 par_3 ...
在sh文件内的 $1 $2 $3 ... 的值则对应以上参数值
注意当参数个数大于等于10时 ${11} 才表示对应参数
此外:
$* #所有参数(可以进行遍历)
$# #参数个数
$0 #此sh文件的名称
4.2 管道符
将管道符左边指令的结果传给右边的命令当做参数
ls -l | wc -l #将ls -l打印的结果创给wc,统计ls -l打印的行数
date "+%F" | cut -c 6-7 #将当前时间的年月日传递给cut作为参数
5 数组
5.1 数组定义
array_n=(str_1 str_2 str_3)
5.2 数组操作
echo $array_n #只能获取个
echo ${array_n[i_ndex]} #获取下标为index的数据
echo ${array_n[*|@]} #获取全部数据
echo ${#aarray_n[*]} #长度
array[i_ndex]=s_tr #修改|添加数据
unset arr[i_ndex] #删除数据
5.3 数组遍历
for i in ${arr[*]}; do #遍历数组
echo $i
done
二、运算符
1 算数运算符
$[a+b] $[a-b] $[a*b] $[a/b]
$[a%b] #取余
$[a**b] #幂
$[(a+b)*b] #可用括号
2 比较运算符
$a -eq $b #(equal)判断是否相等 等价于 $a == $b
$a -ne $b #(not equal)判断是否不相等 等价于 $a != $b
$a -gt $b #(greater than)判断是否大于
$a -lt $b #(less than)判断是否小于
$a -ge $b #(greater than or equal)判断是否大于等于
$a -le $b #(less than or equal)判断是否小于等于
比较运算符不容易在linux中直接运行
用条件语句形式写入shell文件再执行,【例】
#!/bin/bash
a=10
b=3
if [ $a -eq $b ]; then
echo 'a=b'
else
echo 'a<>b'
fi
3 逻辑运算符
#与
if后的条件 [ $a -gt 0 -a $b -gt 0 ]
等价于 [[ $a -gt 0 && $b -gt 0 ]]
等价于 ((a>0 &&b>0)) #(())这种形式使得大多数c语言都可以在shell中运行
#或
if后的条件 [ $a -gt 0 -o $b -gt 0 ]
等价于 [[ $a -gt 0 || $b -gt 0 ]]
#非【了解】
if后的条件 [ ! $a -gt 0 ]
逻辑运算符不容易在linux中直接运行
用条件语句形式写入shell文件再执行,【例】
#!/bin/bash
a=10
b=3
if [ $a -gt 0 -a $b -gt 0 ]; then
echo '都大于0'
else
echo '不都大于0'
fi
if [[ $a -gt 0 && $b -gt 0 ]]; then
echo '都大于0'
else
echo '不都大于0'
fi
if((a>0 &&b>0)); then
echo "都大于0"
fi
4 字符串运算符
$a = $b #判断是否相等
$a != $b #判断是否不相等
-z $a #判断a长度是否为零
-n $a #判断a长度是否不为零
$a #判断a是否不为空
5 文件测试运算符
-e $f #判断文件或目录是否存在
-f $f #判断文件是否存在
-d $f #判断目录是否存在
-r|w|x $f #判断是否可读|写|执行
三、输入输出
1 输入
#read输入
read -p "请输入一个整数" var_n #“-p”是用于给提示
2 输出
2.1 echo
echo $a #echo输出 自动换行
echo -n s_tr #不换行
echo -e s_tr\n #使“\n”为换行符
man echo #查看命令的详细信息
注意:
echo * #得 “shell”
echo "*" #得 “*”
echo $a*$b=$[a*b] #此处“*”被认为是字符
echo $a * $b=$[a*b] #此处“*”被认为是“shell”
echo "$a*$b=$[a*b]" #此处“*”被认为是字符 #双引号里出$调用变量为其值,其他均为字符
echo "$a * $b=$[a*b]" #此处“*”被认为是字符
2.2 printf
printf #默认不换行 默认支持转义符“\n”
3 重定向
3.1 输入重定向
一般从中端读取输入,重定向就是其他地方的内容读取输入
c_md < f_ile #将输入重定向到文件
【知识例】
read var_n < f_ile # read var_n 后需要一个输入 “< file”表示将file内的文件内容输入给var_n
#但是注意:此处 var_n 只能获取 file 的行内容
wc -l f_ile #返回 f_ile内容的行数 和 文件名
wc -l < f_ile #仅返回 f_ile内容的行数(此处仅把f_ile的内容传递给wc 故无文件名)
wc -l << EOF
> val_1
> val_2
> val_2
> EOF #返回3( EOF 一次性读取多行内容传给命令)
3.2 输出重定向
c_md > f_ile #将命令的结果覆盖到文件中
c_md >> f_ile #将命令的结果追加的文件中
四、控制
1 条件语句
1.1 定义
if condition_1; then #命令不能为空(否则)
command_1
elif condition_2; then
command_2
else
command_3
fi
【例】
if ((year_n%400==)); then
echo "是闰年"
elif ((year_n%4==&&yera_n%100!=)); then
echo "是闰年"
else
echo "不是闰年"
fi
1.2 补充
Bash中的 true 和 false 并非一般情况下的意义
在编写Bash脚本时尽量不要使用
2 循环语句
2.1 while
while c_ond; do #进入循环的条件
c_md
done
2.2 for
2.2.1 对空格隔开的元素进行遍历
for i in v_ar; do
c_mds
done
#v_ar可以是数组,甚至直接是“1 2 3 4 5”(linux的目录也满足这种要求)
var_n=`c_md` #``反引号(把反引号内的命令的打印结果传递给其他变量)
var_n=$(c_md)
【展示例】
var_n=`pwd`
var_n=$(pwd)
2.2.2 仿C语言
for ((c语法)); do #c语法中使用变量可不用“$”
c_mds
done
2.3 until
until c_ond; do #退出循环的条件
c_mds
done
2.4 跳出循环
2.4.1 continue
跳出当前循环,下一次循环仍可进行
2.4.2 break
跳出全部循环
五、函数
这里的函数不具有一般编程语言里的函数性质
仅仅是重复运行函数里的代码
1 定义
[function] func_n()
{
a_ction;
[return i_nt;]
}
#可以不带function直接定义函数
#函数必须在使用之前定义
2 使用
直接输入函数名即可运行
3 返回值
如果没有return 则将后一行命令的运行结果作为返回值#似乎是全部内容!待确定
return后跟数值(范围在0-255)
$? 获取返回值
4 参数
调用函数时可以向里面传递参数
func_name par_1 par_2 ...
#函数内部的 $1 $2 就代表传入的 参数1 参数2
#注意当参数个数大于等于10时 ${11} 才表示对应参数
5 补充 日志函数
记录日志的函数
#时间,用户,级别(info,error,warning),发生了什么
function log()
{
lev=$1
info=$2
echo `date "+%F %T"` `whoami` $lev $info >> 1.log
}
log info "导出成功"
log error "因为权限有问题,导出失败"