变量
变量
变量引用:$ 和 ${}
命令替换
命令输出中提取信息,并将其赋给变量
反引号 和 $()wu=`命令` 或者 wu =$()
注意:`` 和 $() 与= 不能有空格
echo/读取:read
echo命令可用单引号或双引号来划定文本字符串,便可以正常输出。
echo -n :文本字符串和命令输出显示在同一行中read -p "Enter your age:" name
echo "hello $name"read –p 相当于 echo -n 提示作用
read -p "Enter your name: " first last
echo "Checking data for $last, $first…"
-t 指定时间
-s 隐藏输入内容(可用于输入密码)
read 文件内容
count=1
cat test | while read line
do
echo "Line $count: $line"
count=$[ $count + 1 ]
done
标准输入输出
ls -la t test3 test4 2>text1 1>text
&>test 则正确和错误输入到同一个文件
运算符
expr
处理数学表达式
ARG1 | ARG2 如果ARG1既不是null也不是零值,返回ARG1;否则返回ARG2
ARG1 & ARG2 如果没有参数是null或零值,返回ARG1;否则返回0
ARG1 % ARG2 返回ARG1被ARG2除的算术余数
*号等运算符识别不出 需要 加 \
expr 5 \* 2
整数运算$[ ]
bash shell数学运算符只支持整数运算
var1=$[1+5]var1=var * 2]
浮点运算 bc
直接输入bc,进行运算
–q 不显示bash计算器冗长的欢迎信息
scale 控制小数位数
if结构化语句
If 条件;then
fiIf 条件;then
else
fiif 条件;then
elif 条件;then
fi方括号定义了测试条件。注意,第一个方括号之后和第二个方括号之前必须加上一个空格,否则就会报错
if [ condition ]
then
commands
fi
数值比较
-eq 相等
-ge 大于或等于
-gt 大于
-le 小于或等于
-lt 小于
-ne 不等于
字符串比较
str1 = str2 检查str1是否和str2相同
str1 != str2 检查str1是否和str2不同
str1 < str2 检查str1是否比str2小
str1 > str2 检查str1是否比str2大
-n str1 检查str1的长度是否非0
-z str1 检查str1的长度是否0
-o 或 相当于 ||
-a 和 相当于 &&
文件比较
-d file 检查file是否存在并是一个目录
-f file 检查file是否存在并是一个文件
-e file 检查file是否存在
-s file 检查file是否存在并非空
-r file 检查file是否存在并可读
-w file 检查file是否存在并可写
-x file 检查file是否存在并可执行
-O file 检查file是否存在并属当前用户所有
-G file 检查file是否存在并且默认组与当前用户相同
file1 -nt file2 检查file1是否比file2新
file1 -ot file2 检查file1是否比file2旧
复合条件测试
if-then语句允许你使用布尔逻辑来组合测试。有两种布尔运算符可用:
[ condition1 ] && [ condition2 ]
[ condition1 ] || [ condition2 ]
用于数学表达式的双括号
双括号:比较过程中使用高级数学表达式
val++ 后增
val-- 后减
++val 先增
--val 先减
! 逻辑求反
~ 位求反
** 幂运算
<< 左位移
/>> 右位移
& 位布尔和
| 位布尔或
&& 逻辑和
|| 逻辑或
== 匹配字符
用于高级字符串处理功能的双方括号
双方括号:针对字符串比较的高级特性
采用的标准字符串比较,具有模式匹配
结构
case
变量和模式是匹配的
通过竖线操作符在一行中分隔出多个模式模式:Y|y
* 会捕获所有与已知模式不匹配的值
shift 移动变量
操作命令行参数
根据它们的相对位置来移动命令行参数
默认情况下它会将每个参数变量向左移动一个位置
即变量2中,变量1中,而变量$1的值则会被删除
#!/bin/bash
echo "The original:$*"
shift 2 #移动两个位置
echo "The position $1"
双破折线
双破折线表示选项列表结束。在双破折线之后脚本就可以放心地将剩下的命令行参数当作参数,而不是选项来处理了
#!/bin/bash
while [ -n "$1" ]
do
case "$1" in
-a) echo "Found the -a option" ;;
-b) echo "Found the -b option";;
-c) echo "Found the -c option" ;;
--) shift
break ;;
*) echo "$1 is not an option";;
esac
shift
done
#
count=1
for param in $@
do
echo "Parameter #$count: $param"
count=$[ $count + 1 ]
done
#!/bin/bash
while [ -n "$1" ]
do
case "$1" in
a) echo "print a";;
b) echo "print b";;
--) shift
break;;
*) echo "$1 is not an option";;
esac
shift
done
count=1
for param in $@
do
echo "param #$count: $param"
count=$[ $count + 1 ]
done
在遇到双破折线时,脚本用break命令来跳出while循环。由于过早地跳出了循环,我们需
要再加一条shift命令来将双破折线移出参数变量
for
for var in list(遍历自身定义一系列值)
do
commands
done
处理循环的输出
!/bin/bash
for (( a=1;a<10;a++ ))
do
echo "The number is $a"
done > wu.txt
对循环的输出使用管道或进行重定向到文件中
更改字段分隔符
bash shell默认
空格
制表符
换行符
为分隔符
IF=$ 可以制定分隔符
IF=\ $’\n’ ,只有\n为分隔符
c语言for
for (( i = 1; i <= 10; i++ ))
do
command
done
while
while command
设置单个命令
只要测试条件成立, while命令就会不停地循环执行定义好的命令
测试条件中用到的变量必须修改,否则就会陷入无限循环
设置多个命令
只有最后一个测试命令的退出状态码会被用来决定什么时候结束循环
until
untile test commands
do
other commands
doneuntil条件成立则不执行,条件不成立则执行与 while 相反
设置单个命令
设置多个命令
控制循环
break
退出任意类型的循环
跳出当前正在执行的循环,完全终止整个循环break n
n指定了要跳出的循环层级
continue
continue命令可以提前中止某次循环中的命令但并不会完全终止整个循环。
跳过此次循环中剩余的命令,但整个循环还会继续。
可以在循环内部设置shell不执行命令的条件。
continue n
实例
查找可执行文件
这个脚本使用了两个不同的IFS值来解析数据。第一个IFS值解析出/etc/passwd文件中的单独
的行。内部for循环接着将IFS的值修改为冒号,允许你从/etc/passwd的行中解析出单独的值。
处理用户输入
$0 表示程序名本身
在第9个变量之后,你必须在变量数字周围加上花括号,比如/${10}
解决变量$0不显示就会使用整个路径。
#!/bin/bash
name=$(basename $0)
echo The script name is:$name
echo This is $0
$# 参数统计
判断命令行上有多少参数
echo there were $#
抓取所有的数据
$* 将这些参数视为一个整体
$@ 参数当作同一字符串中的多个独立的单词
#!/bin/bash
count=1
for param in "$*"
do
echo "\$* is #$count=$param"
count=$[ $count + 1 ]
done
for param in "$@"
do
echo "\$@ is #$count=$param"
count=$[ $count + 1 ]
done
${!#}
没有任何参数时, $#的值为0,
${!#}变量会返回命令行用到的脚本名
带参数时,显示数量相当于 !#
#!/bin/bash
num=$#
echo The num is $num
echo The "!#" is ${!#}
$$ $?
显示当前进程
上个命令的退出状态
函数
创建函数
有两种格式
一
function name {
commands
}二
name() {
commands
}
name函数的唯一名称,若定义名字一样则后续会替换第一个
commands函数中出现的顺序依次执行
注:
name 和 { 要有空格,否则出错
#!/bin/bash
function wu {
echo "This my first function"
}
count=1
while [ $count -le 3 ]
do
wu
count=$[ $count + 1 ]
done
wu
function wu {
echo $[ $1 * $2 ]
}
if [ $# -eq 2 ];then
value=$(wu $1 $2)
echo "The result is $value"
else
echo "uage:file a b"
fi
前面的$1h和$2和脚本主体中的$1和$2变量并不相同
要在函数中使用这些值,必须在调用函数时手动将它们传过去。
return
函数的退出状态码是函数中最后一条命令返回的退出状态码:$?
但是无法知道其他命令中是否成功运行
return命令来退出函数并返回特定的退出状态码(整数值0~255,大于则会出错)
function wu {
read -p "Enter a value: " value
return $[ $value * 2 ]
}
注意:
函数一结束就取返回值
退出状态码必须是0~255
break
退出函数并返回特定的退出状态码
跳出循环体,该循环体已结束
contiune
中断循环中的迭代,若有指定的条件则继续循环下一个迭代
循环没有结束
局部变量
函数内部使用的任何变量都可以被声明成局部变量
局部变量:在变量声明的前面加上local关键
function wu {
local temp=$[ $value + 5 ]
result=$[ $temp * 2 ]
}
temp=4
value=6
wu
echo "The result is $result"
if [ $temp -gt $value ];then
echo "temp is larger"
else
echo "temp is smaller"
fi
数组
如果你试图将该数组变量作为函数参数,函数只会取数组变量的第一个值。
将该数组变量的值分解成单个的值,然后将这些值作为函数参数使用。
在函数内部,可以将所有的参数重新组合成一个新的变量。
#!/bin/bash
function testit {[图片上传中...(5.png-438497-1538820881421-0)]
local newarray=`echo "$@"`
echo "The new array value is: ${newarray[*]}"
}
myarray=(1 2 3 4 5)
echo "The original array is ${myarray[*]}"
testit ${myarray[*]}