NO. |
目录 |
1 |
shell优点 |
2 |
基本格式 |
3 |
输出程序 echo |
4 |
shell 变量 |
5 |
引号 |
6 |
循环 |
7 |
循环控制 |
8 |
条件判断 |
9 |
算数运算 |
10 |
逻辑运算符 |
11 |
函数 |
12 |
字符窜操作 |
13 |
数组 |
14 |
重定向 |
15 |
其他命令 |
1. shell优点
- 语法和结构通常比较简单
- 学习和使用通常比较简单
- 通常不需要编译
- 适合处理文件和目录之类的对象
2. 基本格式
- 建立一个“test.sh”文件,在文件内输入以下代码
#!/usr/bin/env bash
echo "hello world"
image.png
3. 输出程序 echo
#!/usr/bin/env bash
echo "hello world"
echo hello world
text="hello world"
echo $text
echo -e "hello \nworld" #输出并且换行
echo "hello world" > a.txt #重定向到文件
echo `date` #输出当前系统时间
image.png
4. shell 变量
1、只能使用数字,字母和下划线,且不能以数字开头
2、变量名区分大小写
3、“=”前后不能有空格
#!/usr/bin/env bash
echo "hello world"
myText="hello world"
muNum=100
echo $myText
echo $muNum
echo myText
echo muNum
image.png
$? |
接收上一条命令的返回状态码返回状态码在0-255之间 |
$$ |
获取当前shell的进程号(PID)(可以实现脚本自杀)(或者使用exit命令直接退出也可以使用exit [num]) |
$! |
Shell最后运行的后台Process的PID |
$- |
使用Set命令设定的Flag一览 |
$* |
所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 |
$@ |
所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。 |
$# |
添加到Shell的参数个数 |
$0 |
Shell本身的文件名 |
$1~$n |
添加到Shell的各参数值。$1是第1参数、$2是第2参数…。 |
#!/usr/bin/env bash
printf "The complete list is %s\n" "$$"
printf "The complete list is %s\n" "$!"
printf "The complete list is %s\n" "$?"
printf "The complete list is %s\n" "$*"
printf "The complete list is %s\n" "$@"
printf "The complete list is %s\n" "$#"
printf "The complete list is %s\n" "$0"
printf "The complete list is %s\n" "$1"
printf "The complete list is %s\n" "$2"
image.png
5. 引号
- ''单引号不解析变量
- ""双引号会解析变量
- ``反引号是执行并引用一个命令的执行结果,类似于$(...)
image.png
6. 循环
#!/usr/bin/env bash
# 方法一
for ((i=0;i<10;i++))
do
printf $i
done
echo
# 方法二
for i in 0 1 2 3 4 5 6 7 8 9
do
printf $i
done
echo
# 方法三
for i in {0..9}
do
printf $i
done
image.png
#!/usr/bin/env bash
COUNTER=0
while [ $COUNTER -lt 5 ]
do
COUNTER=`expr $COUNTER + 1`
echo $COUNTER
done
echo '请输入。。。'
echo 'ctrl + c 即可停止该程序'
while read NUM
do
echo "Yeah! great NUM the $NUM"
done
image.png
7. 循环控制
break #跳出所有循环
break n #跳出第n层f循环
continue #跳出当前循环
8. 条件判断
参数 |
解释 |
-gt |
大于 |
-lt |
小于 |
-ge |
大于等于 |
-le |
小于等于 |
-eq |
等于 |
-ne |
不等于 |
#!/usr/bin/env bash
a=10
b=20
if [ $a -eq $b ]
then
echo "true"
else
echo "false"
fi
if [ $a -ne $b ]
then
echo "true"
else
echo "false"
fi
if [ $a -gt $b ]
then
echo "true"
else
echo "false"
fi
if [ $a -lt $b ]
then
echo "true"
else
echo "false"
fi
if [ $a -ge $b ]
then
echo "true"
else
echo "false"
fi
if [ $a -le $b ]
then
echo "true"
else
echo "false"
fi
image.png
例如[ $num1 -gt $num2 ]或者test $num1 -gt $num2
#!/usr/bin/env bash
num1=4
num2=5
str1=Alice
str2=Bob
if [ $num1 -gt $num2 ]
then
echo $num1 large than $num2
else
echo $num1 lower than $num2
fi
if [ -z $str1 ]
then
echo str1 is empty
else
echo str is not empty
fi
image.png
#!/usr/bin/env bash
a=10
b=20
if [ $a == $b ]
then
echo "true"
fi
if [ $a == $b ]
then
echo "true"
else
echo "false"
fi
if [ $a == $b ]
then
echo "a is equal to b"
elif [ $a -gt $b ]
then
echo "a is greater than b"
elif [ $a -lt $b ]
then
echo "a is less than b"
else
echo "None of the condition met"
fi
image.png
a|b |
a或者b |
* |
匹配任意长度的任意字符 |
? |
匹配任意单个字符 |
[a-z] |
指定范围内的任意单个字符 |
#!/usr/bin/env bash
num=10
case $num in
1)
echo 1
;;
2)
echo 2
;;
10)
echo 10
;;
*)
echo somethin else
;;
esac
image.png
9. 算数运算
#!/usr/bin/env bash
echo "Hello World !"
a=3
b=5
val=`expr $a + $b`
echo "Total value : $val"
val=`expr $a - $b`
echo "Total value : $val"
val=`expr $a \* $b`
echo "Total value : $val"
val=`expr $a / $b`
echo "Total value : $val"
image.png
- 进行四则运算的时候运算符号前后一定要有空格,乘法的时候需要进行转义。
其他运算符 |
含义 |
% |
求余 |
== |
相等 |
= |
赋值 |
!= |
不相等 |
! |
非 |
-o |
或 |
-a |
与 |
#!/usr/bin/env bash
a=3
b=5
val=`expr $a / $b`
echo "Total value : $val"
val=`expr $a % $b`
echo "Total value : $val"
if [ $a == $b ]
then
echo "a is equal to b"
fi
if [ $a != $b ]
then
echo "a is not equal to b"
fi
image.png
10. 逻辑运算符
#!/usr/bin/env bash
num1=10
num2=20
num3=15
if [ $num1 -lt $num3 -a $num2 -gt $num3 ]
then
echo $num3 is between 10 and 20
else
echo something else
fi
image.png
- if [ 条件A ] && [条件B ]
- if((A&&B))
- if [[ A&&B ]]
#!/usr/bin/env bash
num1=10
num2=20
num3=15
if [[ $num1 -lt $num3 && $num2 -gt $num3 ]]
then
echo $num3 is between 10 and 20
else
echo something else
fi
image.png
11. 函数
#!/usr/bin/env bash
# 定义一个没有返回值的函数,然后调用该函数
sysout(){
echo "hello world"
}
sysout
# 定一个有返回值的函数,调用该函数,输出结果
test(){
aNum=3
anotherNum=5
return $(($aNum+$anotherNum))
}
test
result=$?
echo $result
image.png
#!/usr/bin/env bash
# 定义了一个需要传递参数的函数
test(){
echo $1 #接收第一个参数
echo $2 #接收第二个参数
echo $3 #接收第三个参数
echo $# #接收到参数的个数
echo $* #接收到的所有参数
}
test aa bb cc
image.png
- read
- read命令接收标准输入(键盘)的输入,或者其他文件描述符的输入。得到输入后,read命令将数据放入一个标准变量中。
#!/usr/bin/env bash
read -p "Enter your name:" VAR_NAME
echo "hello $VAR_NAME, welcome to my program"
read -t 10 -p "enter your name:" VAR_NAME
echo "hello $VAR_NAME, welcome to my program"
read -s -p "Enter your password: " pass
echo "hello $VAR_NAME, your password is $pass"
image.png
declare [-aixr] variable
-i: 把变量定义为整数
-a: 把变量定义为数组
-x: 把变量变成环境变量
-r: 可读变量
ChengkaideMacBook-Pro:~ chengkai$ sum=100+300+50
ChengkaideMacBook-Pro:~ chengkai$ echo $sum
100+300+50 # 文字类型的变量属性无法相加
ChengkaideMacBook-Pro:~ chengkai$ declare -i sum=100+300+50 # -i把变量定义为整数数字
ChengkaideMacBook-Pro:~ chengkai$ echo $sum
450
12. 字符窜操作
str1="Hello"
str2="World"
echo ${#str1} # 输出字符窜长度
echo ${str1:0:3} # 截取字符窜
echo $str1" "$str2 # 字符窜拼接
image.png
13. 数组
#!/usr/bin/env bash
array=(1 2 3 4 5) #定义数组
array2=(aa bb cc dd ee) #定义数组
value=${array[3]} #找到某一个下标的数,然后赋值
echo $value #打印
value2=${array2[3]} #找到某一个下标的数,然后赋值
echo $value2 #打印
length=${#array[*]} #获取数组长度
echo $length
image.png
14. 重定向
命令 |
说明 |
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 之间的内容作为输入。 |
/dev/null |
禁止输出 |
- 注意:0 是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。
$echo result > file #将结果写入文件,结果不会在控制台展示,而是在文件中,覆盖写
$echo result >> file #将结果写入文件,结果不会在控制台展示,而是在文件中,追加写
echo input < file #获取输入流
$ command > file 2>&1 # 将 stdout 和 stderr 合并后重定向到 file,
$ command < file1 >file2 # command 命令将 stdin 重定向到 file1,将 stdout 重定向到 file2。
15. 其他命令
- date
- 格式化输出 +%Y-%m-%d
- 格式%s表示自1970-01-01 00:00:00以来的秒数
#!/usr/bin/env bash
echo `date +%Y-%m-%d-%H:%M:%S`
echo `date +%s`
bash test.sh &
nohup test.sh &
参考文献
- http://www.jianshu.com/p/71cb62f08768
- http://blog.csdn.net/u011204847/article/details/51184883
网友评论