一、变量和备注
1.1.备注:和普通的编程语言一样,用井号后面内容(#)来表示备注
1.2.变量:变量分为系统变量和用户变量,在shell中经常用到系统变量,通常使用 美元符号 变量名称 来引用变量
变量名和等号之间不能有空格。同时,变量名的命名须遵循如下规则:
首个字符必须为字母(a-z,A-Z)。
中间不能有空格,可以使用下划线(_)。
不能使用标点符号。
不能使用 bash 里的关键字(可用 help 命令查看保留关键字)
例如:
echo $PATH
除了直接赋值,还可以用语句给变量赋值
for file in `ls /etc`
注意:定义变量时等号前后不要有空格,$后面跟着变量名来引用
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变
myUrl="http://www.baidu.com"
readonly myUrl
myUrl="http://www.baidu.com"
=左右不要有空格
如果内容有空格,需要使用单引号或者双引号
双引号支持转移 $ 开头的遍历会被自动替换
1.3、变量的使用
echo $a
echo ${b}
echo "$a"
使用$var或者${var}来访问遍历 后者更为严谨
遍历不需要定义也可以使用,引用未定义的遍历,默认为空值
预定义变量
数组变量
使用()来定义数组变量,中间使用空格隔开
例如
array=(1 2 3 4)
array=('ls')
echo ${array[2]};
echo ${array[*]}
echo ${#array[*]}
···
####二、获取用户输入
获取用户输入就需要用到read命令
echo "please input your name: "
read name
echo "You nam is $name"`
获取用户输入的多个输入
echo "please input your name: "
read name1 name2 name3
echo "You nam is name2, $name3"`
按照空格取值,不够的输入空,多的在最后一个打印出来
想要换行 就是在read后面加入-p
read -p "please input your username: " name
read -sp "please input your password: " pw
这里的-s在密码输入的时候用到,输入过程看不到输入的内容
echo "Your nam is pw"`
这里要了解位置参数
从命令行传递到脚本的参数:```$0,$1,$2,$3...```
```$0 就是脚本文件自身的名字,$1 是第一个参数,$2 是第二个参数,$3 是第三个参数,然后是第四个。$9 之后的位置参数就必须用大括号括起来了,比如,${10},${11},${12}。
$# : 传递到脚本的参数个数
$* : 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过 9 个
$$ : 脚本运行的当前进程 ID 号
$! : 后台运行的最后一个进程的进程 ID 号
$@ : 与 $* 相同,但是使用时加引号,并在引号中返回每个参数
$: 显示 shell 使用的当前选项,与 set 命令功能相同
$? : 显示最后命令的退出状态。 0 表示没有错误,其他任何值表明有错误。
三、特殊符号
3.1.#注释
echo The # 这里开始一个注释
3.2.;(分号)
使用分号 ; 可以在同一行上写两个或两个以上的命令。
echo hello; echo there
3.3..(点号)
source filename.sh
. filename.sh
3.4.引号
3.4.1单引号
阻止 STRING 中所有特殊字符的解释,这是一种比使用"更强烈的形式
3.4.2 双引号
阻止(解释)STRING 中大部分特殊的字符
3.5.斜线和反斜线
3.5.1斜线
文件名路径分隔符
例如D:\Program Files\MuMu
3.5.2反斜线
D:\Program Files\MuMu
\n 表示新的一行
\r 表示回车
\t 表示水平制表符
\v 表示垂直制表符
\b 表示后退符
\a 表示"alert"(蜂鸣或者闪烁)
\0xx 转换为八进制的 ASCII 码, 等价于 0xx
" 表示引号字面的意思
3.6.`(反引号)
cp `mkdir back` test.sh back
#先创建了 back 目录,然后复制 test.sh 到 back 目录。
3.7.:冒号
3.71.空命令
什么作用都没有
3.7.2变量扩展/子串替换
与 > 重定向操作符结合使用时,会把一个文件清空,不会修改这个文件的权限。如果之个文件并不存在,那么就创建这个文件
: > test.sh # 文件“test.sh”现在被清空了
# 与 cat /dev/null > test.sh 的作用相同
# 然而,这并不会产生一个新的进程, 因为“:”是一个内建命令
3.8.?问号
测试操作符
#!/bin/bash
a=10
(( t=a<50?8:9 ))
echo $t
3.9.$一直在用
3.10.()小括号
命令组:在括号中的命令列表,将会作为一个子 shell 来运行
#!/bin/bash
a=123
( a=321; )
echo "$a" #括号将判断为局部变量,所以a的值为123而不是321
初始化数组
arr=(1 4 5 7 9 21)
echo ${arr[3]}
3.11、{} 大括号
文件名扩展
if [ ! -w 't.txt' ];
then
touch t.txt
fi
echo 'test text' >> t.txt
cp t.{txt,back}#在大括号中不允许有空白,除非这个空白被引用或转义
代码块
3.12.[]中括号
3.12.1、条件测试
a=5
if [ $a -lt 10 ]
then
echo "a: $a"
else
echo 'a>=10'
fi
3.12.2、数组元素
在一个 array 结构的上下文中,中括号用来引用数组中每个元素的编号
arr=(11 21 31)
arr[0]=10
echo ${arr[0]}
3.13、< 和 > 尖括号
3.13.1、重定向
test.sh > filename:重定向 test.sh 的输出到文件 filename 中。如果 filename 存在的话,那么将会被覆盖。
test.sh &> filename:重定向 test.sh 的 stdout(标准输出)和 stderr(标准错误)到 filename 中。
test.sh >&2:重定向 test.sh 的 stdout 到 stderr 中。
test.sh >> filename:把 test.sh 的输出追加到文件 filename 中。如果 filename 不存在的话,将会被创建。
3.14.|(竖线)
分析前边命令的输出,并将输出作为后边命令的输入,产生命令链。
chmod 755 test.sh #给文件test.sh赋权限
ls -l | ./test.sh #输送 ls -l 的输出到一个脚本中
3.15.-(破折号)
3.15.1选项,前缀
在所有的命令内如果想使用选项参数的话,前边都要加上“-”
15.2用于重定向 stdin 或 stdout
#用于备份最后 24 小时当前目录下所有修改的文件
BACKUPFILE=backup-$(date +%m-%d-%Y)
# 在备份文件中嵌入时间.
archive=${1:-$BACKUPFILE}
# 如果在命令行中没有指定备份文件的文件名,
# 那么将默认使用"backup-MM-DD-YYYY.tar.gz".
tar cvf - `find . -mtime -1 -type f -print` > $archive.tar
gzip $archive.tar
echo "Directory $PWD backed up in archive file \"$archive.tar.gz\"."
exit 0
四、基本的预算符号
4.1.算数运算符
例如:
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
原生 bash 不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
注意使用的反引号(esc 键下边)
表达式和运算符之间要有空格 $a + $b 写成 $a+$b 不行
条件表达式要放在方括号之间,并且要有空格 [ $a == $b ] 写成 [$a==$b] 不行
可以用expr判断一个字符串是否是整数
awk可以实现整数和小数计算:
awk "2.1 2.5"|awk '{print $1-$2}'
格式化显示可以用:
awk "3.134 2.532" |awk '{printf("%.2\n", $1-$2)}'
乘号(*)前边必须加反斜杠(\)才能实现乘法运算
4.2.关系运算符
-eq:检测左边的数是否相等,如果相等,返回true
-ne:检测左边的数是否不相等,如果不相等,返回true
-gt:检测左边的数是否大于右边的,如果是,返回true
-lt:检测左边的数是否小于右边的,如果是,返回true
-ge:检测左边的数是否大于等于右边的,如果是,返回true
-le:检测左边的数是否小于等于右边的,如果是,返回true
例如
a=5
b=10
if [ $a -eq $b ]
then
echo "$a -eq $b : a == b"
else
echo "$a -eq $b: a != b"
fi
4.3.逻辑运算符
&&: 逻辑的AND
|| :逻辑的OR
a=5
b=10
if [[ $a -lt 100 && $b -gt 100 ]]
then
echo "return true"
else
echo "return false"
fi
if [[ $a -lt 100 || $b -gt 100 ]]
then
echo "return true"
else
echo "return false"
fi
4.4.字符串运算符
a="abc"
b="efg"
if [ $a = $b ]
then
echo "$a = $b : a == b"
else
echo "$a = $b: a != b"
fi
if [ -n $a ]
then
echo "-n $a : The string length is not 0"
else
echo "-n $a : The string length is 0"
fi
if [ $a ]
then
echo "$a : The string is not empty"
else
echo "$a : The string is empty"
fi
4.5字符串操作
取值
掐头趣味与内容替换
4.6.文件测试运算符
file="/home/shiyanlou/test.sh"
if [ -r $file ]
then
echo "The file is readable"
else
echo "The file is not readable"
fi
if [ -e $file ]
then
echo "File exists"
else
echo "File not exists"
fi
4.7.浮点型计算
bash默认是不支持浮点型数字计算,需要安装bc软件,然后通过bc才能计算浮点型。
安装bc
sudo apt-get update
sudo apt-get install bc
#加法运算
n1=3.45
n2=0.78
echo "3.45+0.78" | bc
#乘法运算
r=3.4
pi=3.14159
g=$(echo "scale=4; 3.14 * 2 * $r" | bc)
a=$(echo "scale=4; 3.14 * $r * $r" | bc)
echo "g=$g"
echo "a=$a"
注意:运行Bash的脚本的方式有:
sh filename.sh
bash filename.sh
../filename.sh
source filename.sh
. filename.sh
chomd u+rx filename.sh 赋权限并运行