一、如何创建shell脚本
1、通过vim shell.sh
2、通过touch shell.sh 之后在vim shell.sh
二、如何运行shell脚本
1、/bin/sh shell.sh
2、sh shell.sh
三、如何创建shell变量
name="张三" 注意:在shell脚本中等于号两边不能有空格,可以以下划线为前缀,其他符号不行
四、如何使用shell变量
1、$name 在变量之前加上$就行了,推荐用于字符拼接
2、${name} 这种类似于java中的占位符 不需要使用+进行拼接 例子echo "I am good at ${skill}Script"
五、只读变量
readonly name 可在任意位置添加,添加之后在该代码执行之后则后面的代码中不能重新对该变量进行复制,类似java中的final,如果改变值会报错
六、删除变量
unset name 执行之后该变量就会被回收,在其他地方引用了的话也不会报错,只是会获取不到该变量的值,推荐删除之后,下面的代码就不要引用该变量了
该方法不能删除只读变量
七、变量分类
1、局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
2、环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
3、shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
八、变量注意点:
赋值可以使用单引号和双引号,两者区别如下:
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
单引号必须成双成对使用
双引号里可以有变量
双引号里可以出现转义字符如(/)
九、字符操作
获取字符长度 echo ${#name}
字符截取 echo ${name:1:4} 在ubuntu中可能会出错,执行sudo dpkg-reconfigure dash 选择否
查找字符下标 echo `expr index "$string" io` 这里不是单引号而是波浪号那个,i和o那个先出现就找那个
十、如何定义数组
arr=(1 2 3 4 5) 值与值之间使用空格分开
十一、数组相关操作
读取数组某个值 ${arr[0]} 下标和java一样 从零开始
读取数组所有值 ${arr[@]} 获取数组中的所有值
获取数组长度 ${#arr[@]} 或 ${#arr[*]} 返回数组长度
十二、shell注释
单行注释:#
多行注释:
:<<EOF
注释内容
注释内容
注释内容
EOF
:<<'
注释内容
注释内容
注释内容
'
:<<!
注释内容
注释内容
注释内容
!
十三、如何传参到shell
在shell中怎么获取参数 $1获取第一个参数 $2获取第二个参数 $3获取第三个参数 $0就是取当前执行的脚本名
在shell中如何传参 sh shell.sh 1 2 3 注意:参数之间使用空格隔开
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数。获取到的值('1 2 3' 把三个参数当成一个处理)
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。获取到的值("1" "2" "3" 每个参数都是独立分开的)
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
十四、shell运算符
1、算数运算符(格式: 变量=` expr number 运算符 number`)
注意:运算符两边需要空格,在运算表达式加上expr关键字,不是单引号,是esc下面那个
在 MAC 中 shell 的 expr 语法是:$((表达式)),此处表达式中的 "*" 不需要转义符号 "\" 。
+ 加法
- 减法
* 乘法(注意:这个*符号可能是shell脚本关键字需要转义) result=`expr $a \* $b`
/ 除法
% 取余 也就是我们常称的 “磨”
= 赋值
== 数字比较(相等)
!= 数字比较 (不相等)
2、关系运算符(格式:number 运算符 number)
注意: 关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
关系运算符用于判断
-eq 判断是否相等 相等返回true
-ne 判断是否不相等 不相等返回true
-gt 检测左边的数是否大于右边的,如果是,则返回 true。相当于>
-lt 检测左边的数是否小于右边的,如果是,则返回 true。相当于<
-ge 检测左边的数是否大于等于右边的,如果是,则返回 true。相当于>=
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。详单与<=
3、布尔运算符(格式:if [ 表达式 运算符 表达式 100 ] 实例:if [ $a -lt 5 -o $b -gt 100 ])
! 取反 表达式为 true 则返回 false,否则返回 true。
-o 多表达式判断时,只要有一个表达式满足条件,返回true
-a 多表达式判断时,所有表达式满足的情况下,返回true
4、逻辑运算符(格式:if [ 表达式 运算符 表达式 100 ])
&& 逻辑的 and 所有表达式满足返回true
|| 逻辑的 or 多个表达式只要满足一个返回true
5、字符串运算符
= 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 检测两个字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z 检测字符串长度是否为0,为0返回 true。 [ -z $a ] 返回 false。
-n 检测字符串长度是否为0,不为0返回 true。 [ -n "$a" ] 返回 true。
$ 检测字符串是否为空,不为空返回 true。 [ $a ] 返回 true。
6、文件测试运算符($file 代表某个文件的绝对路径 格式:if [ -r $file ])
-b file 检测文件是否是块设备文件,如果是,则返回 true。 [ -b $file ] 返回 false。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。 [ -c $file ] 返回 false。
-d file 检测文件是否是目录,如果是,则返回 true。 [ -d $file ] 返回 false。
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 [ -f $file ] 返回 true。
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true。 [ -g $file ] 返回 false。
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 [ -k $file ] 返回 false。
-p file 检测文件是否是有名管道,如果是,则返回 true。 [ -p $file ] 返回 false。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。 [ -u $file ] 返回 false。
-r file 检测文件是否可读,如果是,则返回 true。 [ -r $file ] 返回 true。
-w file 检测文件是否可写,如果是,则返回 true。 [ -w $file ] 返回 true。
-x file 检测文件是否可执行,如果是,则返回 true。 [ -x $file ] 返回 true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。 [ -s $file ] 返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。 [ -e $file ] 返回 true。
十五、echo命令的常用方式
1、显示普通字符串
echo "It is a test"
2、显示转义字符串
echo "\"It is a test\""
3、显示变量
read name 相当于java中的,键盘接收仪 接收用户所输入的值
echo "$name It is a test"
4、显示换行
echo -e "OK! \n" # -e 开启转义 不加-e转义的话 \n直接当字符串处理
echo "It is a test"
5、显示不换行
echo -e "OK! \c" # -e 开启转义 \c 不换行
echo "It is a test"
6、显示结果定向至文件
echo "It is a test" > myfile #将输出的字符串写入到指定文件,文件不存在自动创建
7、原样输出字符串,不进行转义或取变量(用单引号)
echo '$name\"'
输出结果:$name\"
8、显示命令执行结果(使用esc下面的那个,不是单引号)
echo `date` date系统函数
十六、shell printf命令(格式:printf format-string [arguments...] 输出 类似于c中的输出,不会自动换行)
官网查看: https://www.runoob.com/linux/linux-shell-printf.html(鸡肋)
十七、流程控制语句(注意 command和[]之间有空格 运算符前后也有空格)
1、单支判断(if)
if [表达式] ; then
command ....;
command ....;
fi;
2、分支(if else判断)
if [表达式] ; then
command ...;
command ...;
else
command ...;
command ...;
fi;
3 分支(if else if else) 注意:如果是变量 要加上${name}
if [ 表达式 ] ; then
command ....;
elif [ 表达式 ]
command ....;
else
command ....;
fi
十八、循环结构
循环共同点:
break; 跳出循环
continue; 和java中的一样,只会跳出当前这一回合,进入下一个循环。并不是跳出整个循环
1、for循环(https://www.cnblogs.com/EasonJim/p/8315939.html 有完整示例)
语法:
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
示例
for((i=0;i<5;i++))
do
echo ${i}
done
---------------------------------------------------
for i in $(seq 1 5)
do
echo ${i};
done
---------------------------------------------------
for i in {1..10}
do
echo $(expr $i \* 3 + 1);
done
---------------------------------------------------
awk 'BEGIN{for(i=1; i<=10; i++) print i}'
2、while循环(满足表达式才会进入循环主体)
while [ condition ]
do
command
done
//一定要加上这个类似于 number++,不加会死循环
let "number++";
3、until循环(与while恰恰相反,当表达式不满足时,才会进入循环主体)
until [ condition ]
do
command
done
4、case分支选择结构
语法:
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
*) #相当于java中的default(就是一个都匹配不上)
command1
command2
...
commandN
;;
esac
十九、自定义函数
语法:
function name(){
#方法体
return number;
}
name(){
#方法体
return number;
}
注意:两者皆可,参数使用$n,当n>=10,则使用${n},如有返回值使用$?接收
调用:
name 参数列表
其他使用字符
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数(显示所有参数)
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。