声明变量
name='hello world'
使用变量
echo ${name}
设置只读变量
readonly name
删除变量(不能删除只读变量)
name2='name2'
unset name2
设置全局变量
name='name2'
export $name
用户输入
read [-pt] variable
选项与参数:
-p :后面可以接提示字符
-t :后面可以接等待的『秒数!』这个比较有趣~不会一直等待使用者啦!
$ read -p "Your name:" name
Your name:Wang
$ echo $name
Wang
声明变量类型
declare [-aixrp] variable
选项与参数:
-a :将后面名为variable 的变数定义成为阵列(array) 类型
-i :将后面名为variable 的变数定义成为整数数字(integer) 类型
-x :用法与export 一样,就是将后面的variable 变成环境变数;+x 可以取消全局变量哦
-r :将变数设定成为readonly 类型,该变数不可被更改内容,也不能unset
-p :查看某个变量的类型
$ declare -i a
$ a=100+20
$ echo $a
120
字符串拼接
text1='Wang'
test2="I love ${text1}" #注意要用双引号
echo ${text2}
字符串长度
echo ${#text2}
截取字符串(从索引1开始,截取3个字符)
注意,是从某个索引开始,截取几个!而不是截取到几。
aa="012345"
echo ${aa:1:3} # 结果:123
echo ${aa:3:1} # 结果:3
声明数组
数组以圆括号定义,内部的元素以空格分隔
array=('I' 'am' 'beautiful')
读取数组
数组下标以0开始,表示第一个元素
echo ${array[0]}
修改数组元素
array[0]='He'
获取所有元素 @
echo ${array[@]}
数组长度
整个数组长度
length=${#array[@]}
单个元素长度
echo ${#array[1]}
脚本传参
建一个脚本文件test.sh
echo "0 is the file itself: ${0}"
echo "1 is from the cmd : ${1}"
执行:
./test.sh arg1
结果:
0 is the file itself: ./test.sh
1 is from the cmd : arg1
参数处理 | 说明 |
---|---|
$# | 传递到脚本的参数个数 |
$* | 用一个字符串表示所有参数 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 用数组表示所有参数。 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
${num} | ${0} 代表脚本本身; ${1},${2},${3}...则代表第1,2,3个参数; 也可以不加{} |
修改test.sh
如下
echo "0 is the file itself: ${0}"
echo "1 is from the cmd : ${1}"
echo "2 is from the cmd : ${2}"
echo "args number: $#"
echo "args is: $*"
echo "args are: $@"
echo "current pid is: $$"
echo "execute state: $?"
执行:
$ ./test.sh arg1 arg2
结果:
$ ./test.sh arg1 arg2
0 is the file itself: ./test.sh
1 is from the cmd : arg1
2 is from the cmd : arg2
args number: 2
args is: arg1 arg2
args are: arg1 arg2
current pid is: 30204
execute state: 0
运算符
算数运算
运算符 | 说明 | 举例 |
---|---|---|
+ | 加法 | expr $a + $b 结果为 30。 |
- | 减法 | expr $a - $b 结果为 -10。 |
* | 乘法 | expr $a * $b 结果为 200。 |
/ | 除法 | expr $b / $a 结果为 2。 |
% | 取余 | expr $b % $a 结果为 0。 |
= | 赋值 | a=$b 将把变量 b 的值赋给 a。 |
== | 相等。用于比较两个数字,相同则返回 true。 | [ $a == $b ] 返回 false。 |
!= | 不相等。用于比较两个数字,不相同则返回 true。 | [ $a != $b ] 返回 true。 |
例子:
a=10
b=20
val=`expr $a + $b`
echo "a + b : $val"
val=`expr $a - $b`
echo "a - b : $val"
val=`expr $a * $b`
echo "a * b : $val"
val=`expr $b / $a`
echo "b / a : $val"
val=`expr $b % $a`
echo "b % a : $val"
if [ $a == $b ]
then
echo "a 等于 b"
fi
if [ $a != $b ]
then
echo "a 不等于 b"
fi
注意`
expr 表达式
` 是反引号,不是单引号。
注意符号
+
左右一定要加空格
乘号(*)前边必须加反斜杠()才能实现乘法运算;
条件表达式也要空格:
例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]
关系运算符
关系运算符只支持数字,不支持字符串,除非字符串的值是数字。
下表列出了常用的关系运算符,假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举例 |
---|---|---|
-eq | 检测两个数是否相等,相等返回 true。 | [ $a -eq $b ] 返回 false。 |
-ne | 检测两个数是否不相等,不相等返回 true。 | [ $a -ne $b ] 返回 true。 |
-gt | 检测左边的数是否大于右边的,如果是,则返回 true。 | [ $a -gt $b ] 返回 false。 |
-lt | 检测左边的数是否小于右边的,如果是,则返回 true。 | [ $a -lt $b ] 返回 true。 |
-ge | 检测左边的数是否大于等于右边的,如果是,则返回 true。 | [ $a -ge $b ] 返回 false。 |
-le | 检测左边的数是否小于等于右边的,如果是,则返回 true。 | [ $a -le $b ] 返回 true。 |
关系运算符实例如下:
a=10
b=20
if [ $a -eq $b ]
then
echo "$a -eq $b : a 等于 b"
else
echo "$a -eq $b: a 不等于 b"
fi
if [ $a -ne $b ]
then
echo "$a -ne $b: a 不等于 b"
else
echo "$a -ne $b : a 等于 b"
fi
if [ $a -gt $b ]
then
echo "$a -gt $b: a 大于 b"
else
echo "$a -gt $b: a 不大于 b"
fi
if [ $a -lt $b ]
then
echo "$a -lt $b: a 小于 b"
else
echo "$a -lt $b: a 不小于 b"
fi
if [ $a -ge $b ]
then
echo "$a -ge $b: a 大于或等于 b"
else
echo "$a -ge $b: a 小于 b"
fi
if [ $a -le $b ]
then
echo "$a -le $b: a 小于或等于 b"
else
echo "$a -le $b: a 大于 b"
fi
布尔运算符
下表列出了常用的布尔运算符,假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举例 |
---|---|---|
! | 非运算,表达式为 true 则返回 false,否则返回 true。 | [ ! false ] 返回 true。 |
-o | 或运算,有一个表达式为 true 则返回 true。 | [ $a -lt 20 -o $b -gt 100 ] 返回 true。 |
-a | 与运算,两个表达式都为 true 才返回 true。 | [ $a -lt 20 -a $b -gt 100 ] 返回 false。 |
逻辑运算符
以下介绍 Shell 的逻辑运算符,假定变量 a 为 10,变量 b 为 20:
运算符 | 说明 | 举例 |
---|---|---|
&& | 逻辑的 AND | [[ $a -lt 100 && $b -gt 100 ]] 返回 false |
|| | 逻辑的 OR | [[ $a -lt 100 || $b -gt 100 ]] 返回 true |
字符串运算符
下表列出了常用的字符串运算符,假定变量 a 为 "abc",变量 b 为 "efg":
运算符 | 说明 | 举例 |
---|---|---|
== | 检测两个字符串是否相等,相等返回 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。 |
文件测试运算符
文件测试运算符用于检测 Unix 文件的各种属性。
属性检测描述如下:
操作符 | 说明 | 举 |
---|---|---|
-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。 |
其他检查符:
- -S: 判断某文件是否 socket。
- -L: 检测文件是否存在并且是一个符号链接。
实例:
file="/var/www/runoob/test.sh"
if [ -r $file ]
then
echo "文件可读"
else
echo "文件不可读"
fi
if [ -w $file ]
then
echo "文件可写"
else
echo "文件不可写"
fi
echo
显示字符
echo "Hello world!"
显示执行命令结果
注意用反引号
echo `ls` # 显示的结果可能没有格式,在同一行
echo "`ls`" # 按照格式显示出来,有换行
显示原字符(不转义)
使用单引号,可以直接显示原字符串
$ echo '${name}
'
${name}
激活转义 -e
echo -e
可以将转义字符显示
$ echo -e "abc
def"
abc
def
• 删除前一个字符;
•c 最后不加上换行符号;
•f 换行但光标仍旧停留在原来的位置;
• 换行且光标移至行首;
• 光标移至行首,但不换行;
• 插入tab;
•v 与f相同;
• 插入字符;
不换行显示
echo -n
可以不换行继续显示
$ echo -n 'a' ; echo -n 'b' ; echo -n 'c'
abc
定向至文件
echo <result> > file
$ echo "`ls`" > ls.txt
$ cat ls.txt
a.txt
dump_ftrace/
Logs/
Monkey_Doc_Tools/
src/
test.txt
tmp/
utility/
printf
printf是一个输出命令,默认不换行
$ printf "hello " ; printf "world"
hello world
格式化打印
%s 代表字符串,%d 代表整数,%f 代表小数;
$ printf "%s is a %dkg dog" "lili" 6
lili is a 6kg dog
%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%.2f 指格式化为小数,其中.2指保留2位小数。
$ printf "%-6s is a %.4fkg dog" "lili" 6
lili is a 6.0000kg dog
test
test用于判断条件是否成立。
$ if test 1 == 2
> then echo "equal"
> else echo "not"
> fi
not
也可以写成:
$ if [ 1 == 2 ]
> then echo 'equal'
> else echo 'not equal'
> fi
not equal
流程控制
if then
if <condition> ; then <steps> ; fi
fi
是if
反写的,代表着语句结束
if condition
then
command1
command2
...
commandN
fi
写成一行:
if [ condition ]; then steps; fi
eg.
$ if [ 1 == 1 ]; then echo "equal" ;fi
equal
if then else
if [ condition ]
then
command
elif [ condition ] # 可以多个elif then语句,也可以不加elif then 语句
then
command
...
else
command
fi
eg.
$ if [ 1 == 2 ]; then echo "equal" ; else echo "Not equal"; fi
Not equal
for 循环
格式:
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
*****************************************
for ((init,value,))
do
command
done
eg.
$ for x in 1 2 3 4 5
> do
> printf ${x}
> done
12345
$ n=5
$ for ((i=1;i<=$n;i++))
> do
> echo $i
> done
1
2
3
4
5
while 循环
格式:
while condition
do
command
done
eg.
$ a=1
$ while (($a <= 5)); do echo $a ; let "a++"; done
1
2
3
4
5
while 无限循环
while true
do
command
done
until 循环
until 循环与 while 循环在处理方式上刚好相反。until 循环执行一系列命令直至条件为 true 时停止。
语法:
until condition
do
command
done
实例:
$ a=1
$ until [ $a == 5 ]
> do echo $a
> let "a++"
> done
1
2
3
4
case
case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
实例:
$ name="wang"
$ case $name in
> "wang")
> echo "wang"
> ;;
> "zhang")
> echo "zhang"
> ;;
> esac
wang
使用*号:
$ case "haha" in "wang") echo "wang"; ;; "zhang") echo "zhang" ;; *) echo "I don't know what you inputed" ;; esac
I don't know what you inputed
函数
[ function ]是可选的,可写可不写,如果没有返回值,则默认返回最后一个命令的结果,return后跟数值n(0-255)
[ function ] funname [()]
{
action;
[return int;]
}
实例:
$ hello(){
> echo "hello world"
> }
$ hello
hello world
实例2:返回值
# 定义函数
$ hello(){
> echo "recv first arg if $1"
> echo "recv tenth arg is ${10}"
> echo "the sum of $1 and ${10} is $(($1+${10}))"
> return $(($1+${10}))
> }
# 传参
$ hello 1 2 3 4 5 6 7 8 9 10
# 结果:
recv first arg if 1
recv tenth arg is 10
the sum of 1 and 10 is 11
# 使用 $? 获取返回值:
$ echo $?
11
参数处理 | 说明 |
---|---|
$# | 传递到脚本或函数的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数。 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |
输入输出重定向
命令 | 说明 |
---|---|
command > file | 将输出重定向到 file。 |
command < file | 将输入重定向到 file。 |
command >> file | 将输出以追加的方式重定向到 file。 |
n > file | 将文件描述符为 n 的文件重定向到 file。 |
n >> file | 将文件描述符为 n 的文件以追加的方式重定向到 file。 |
n >&m | 将输出文件 m 和 n 合并。 |
n <&m | 将输入文件 m 和 n 合并。 |
<< tag | 将开始标记 tag 和结束标记 tag 之间的内容作为输入。 |
输出重定向:
$ ls > ls.txt
$ cat ls.txt
~$Stability_Basic.xlsx
22gis/
book/
BUGFIX_622/
BUGFIX_622.7z
chrome.lnk*
CNT-CATS-PLAN-Precondition_definition.xlsx
delUpdate.lnk*
desktop.ini
django.md
追加到文件:
$ ipconfig >> ls.txt
zhongtao.wang@GG678S2 MINGW64 ~/Desktop
$ cat ls.txt
~$Stability_Basic.xlsx
22gis/
book/
BUGFIX_622/
BUGFIX_622.7z
chrome.lnk*
CNT-CATS-PLAN-Precondition_definition.xlsx
delUpdate.lnk*
desktop.ini
django.md
Windows IP Configuration
Ethernet adapter Ethernet:
Media State . . . . . . . . . . . : Media disconnected
Connection-specific DNS Suffix . : cnt01.local
Unknown adapter Local Area Connection:
Media State . . . . . . . . . . . : Media disconnected
Connection-specific DNS Suffix . :
Wireless LAN adapter Local Area Connection* 2:
Media State . . . . . . . . . . . : Media disconnected
Connection-specific DNS Suffix . :
Wireless LAN adapter Local Area Connection* 1:
标准输入输出:
一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:
- 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
- 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
- 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。
将错误重定向到文件:
command 2 > file
command 2 >> file
stdout 和 stderr 合并后重定向到文件:
command > file 2>&1
/dev/null 文件
/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃
command > /dev/null
屏蔽 stdout 和 stderr
command > /dev/null 2>&1
导入文件
. filename # 注意点号(.)和文件名中间有一空格
或
source filename
实例:
t1.sh
name="Elias"
t2.sh
. ./t1.sh
name2=$name
echo $name2
执行:
$ ./t2.sh
Elias
其他内容:
括号含义
()
1.子进程
a=0
(a=1;b=2;echo $a) # 子进程内输出a为1
echo $a # 主进程,输出a为0
2.格式为 $(command)
,相当于 command
。shell遇到此格式,会先执行 command
命令,得到标准输出,再将此输出放回到原来命令。
SCRIPTPATH=$(dirname $0) # sh脚本的相对目录
3.数组
数组用括号来表示,元素用"空格"符号分割开。
array=(1 2 3 4)
(())
1.表达式 $((exp))
,其中exp
只要符合C语言规则的运算符即可,包括加减乘除、+=
、<=
、>=
等。
进行不同进位(如二进制、八进制、十六进制)运算时,输出结果会全都自动转化成十进制。
echo $((2*2+(1-2))) # 输出3
a=1
echo $((a++)) # 输出2,且从此之后a=2
2.更新变量值
在((exp))
中可以对变量进行定义或重新赋值,且之后脚本全部有效(不是像()
那样只在子进程有效)。
a=1
((a=2))
echo $a # 输出2
3.算数比较
在((exp))
中可以进行算术比较(不能进行字符串比较),双括号中的变量可以省略$
符号前缀,当然也可以带着。
$ a=1
$ if ((a==1))
> then echo 'equal'
> fi
equal
[]
1.条件判断
[]
本质上是 test
语句,[
是调用test
的命令标识,]
是关闭条件判断
$ if [ 1 == 1 ]
> then echo 'equal'
> fi
equal
[[]]
条件判断,比[]更加高级
$ if [[ 1+2 -gt 2 ]]; then echo "True"; else echo "False"; fi
True
使用[]就出错了
$ if [ 1+2 -gt 2 ]; then echo "True"; else echo "False"; fi
bash: [: 1+2: integer expression expected
False
原文链接:https://blog.csdn.net/HappyRocking/java/article/details/90609554
变量内容的替换,删减
格式:
${var [# | ## | % | %%] pattern } # 变量删除
${var [// | /]old/new} # 变量内容的替换
参数:
- #:从左往右删除符合pattern的字符串(非贪婪模式,只匹配最短的那个)
- ##:从左往右删除符合pattern的字符串(贪婪模式,匹配最多的那个)
- %:从右往左删除符合pattern的字符串(非贪婪模式)
- %%:从右往左删除符合pattern的字符串(贪婪模式)
- /:替换第一个匹配到的字符串
- //:替换所有符合的字符串
示例:
$ name='111222333444555'
$ echo ${name#*2} # 从左删除到2,非贪婪模式
22333444555
$ echo ${name##*2} # 贪婪模式
333444555
$ echo ${name%2*} # 从右往左删除到2,非贪婪
11122
$ echo ${name%%2*}
111
替换:
$ echo ${name/1/a}
a11222333444555
$ echo ${name//1/a}
aaa222333444555
变数设定方式 | var1= | var1='' | var1 已设定非为空字串 | 解释 |
---|---|---|---|---|
var=${var1-var2} | var=var2 | var='' | var=$var1 | var1=None时,var取值var2;否则取值var1 |
var=${var1:-var2} | var=var2 | var=var2 | var=$var1 | var1=None或者=‘’时,var取值var2,否则取值var1 |
var=${var1+var2} | var= | var=var2 | var=var2 | var1=None时,var取值None,否则取值var2 |
var=${var1:+var2} | var= | var='' | var=var2 | var1=None或者=‘’时,var取值var1,否则取值var2 |
var=${var1=var2} | var1=var2 | var1="" | var1不变 | 当var1=None时,var和var1都取值var2,否则取值var1 |
var=${var1:=var2} | var1=var2 | var1=var2 | var1不变 | 当var1=None或=“”时,var和var1都取值var2,否则取值var1 |
var=${var1?var2} | var2 输出至stderr | var='' | var=$var1 | 当var1=None,var2输出到stderr,否则var取值var1 |
var=${var1:?var2} | var2 输出至stderr | var2 输出至stderr | var=$var1 | 当var1=None或=“”时,var2输出到stderr,否则var取值var1 |