31.read:从键盘读取输入
$read variable
$echo $variable
$read -p "Enter value: " value #-p:代表prompt,显示提示语。
如果未在read命令后面指定变量,那么会将输入值存储到默认的变量REPLY中
#!/bin/bash
echo "where do you stay ?"
read
echo "you stay in $REPLY"
read后面也可以跟多个变量,那么键盘输入的也会按照空格进行分开,并依次填入到各个变量中去。
#!/bin/bash
echo "What is your name?"
read fname mname lname
echo "Your first name is : $fname"
echo "Your middle name is : $mname"
echo "Your last name is : $lname"
read也可以将内容存到一个数组中:
read -a cities
echo "Name of city is ${cities[2]}"
如果希望用户按enter键,可以用read命令后面跟一个无用的变量。
echo "please press enter to proceed further"
read temp
echo "now backup operation wil be started!"
32.here操作符。
语法格式:
将2个here之间的内容作为命令cat的输入。here可以替换为任意的分界符,cat也可以替换为其他命令。
$cat << here
sss
fff
here
例子:
执行一个压缩备份操作,并将操作结果发送到指定邮箱。
1 tar -cvf /Users/liudong/tmp.gz /Users/liudong/tmp 2>/dev/null
2 [ $? -eq 0 ] && status="Success" || status="Failed"
3 #send email to administrator
4 mail -s 'Backip status' 735106520@qq.com <<end_of_msg
5 The backup job finished.
6 End date: $(date)
7 Status:$status
8 end_of_msg
文本文件字符串替换功能:
将flowers.txt中的Rose替换为Lily。ed为一个系统内的一个文本编辑器。
1 cat flowers.txt
2 ed flowers.txt << quit
3 ,s/Rose/Lily/g
4 w
5 q
6 quit
7 cat flowers.txt
如何在here操作中使用字面量的方式显示一些系统变量,如USER PATH NAME
1 filename="test1"
2 cat << 'Quoted_End_Marker'
3 When we add quotes before and after here document marker,we can include variables Such as $USER, $PATH, $name and similar
4 Quoted_End_Marker
here结合<<<使用:
wc -w <<< 'Good Morning and have a nice day !' #别忘了这个单引号
33.wc:统计并显示文本文件的行数 单词数 字符数
34.文件操作符相关。
将文件与文件描述符进行绑定:
write描述符:
1 exec 3> sample_out.txt #将sample_out.txt作为输出文件,并将文件描述符3分配给该文件。
2 echo "This is a test message for sample_out.file file" >&3 #写内容到文件描述符3中
3 date >&3 # 将命令的输出写入到文件中
4 exec 3<&- #关闭与文件描述符相关联的文件。
read描述符:
exec 3< sample_out.txt
cat <&3
exec 3<&-
同时作为write read描述符:
1 file_name="sample_out.txt"
2 exec 3<> $file_name
3 echo """
4 Do not dwell in the past,
5 do not dream of the future,
6 concentrate the mind on thre presetn moment. - Buddha
7 """ >&3
8 exec 3>&-
读取本机信息的例子:
1 cp /etc/hosts hosts2
2 grep -v '^#' hosts2 > hosts3
3 exec 3< hosts3
4 exec 4> hostsfinal
5 read <& 3 address1 name_1 extra_info
6 read <& 3 address2 name_2 extra_info
7 echo $name_1 $address1 >& 4
8 echo $name_2 $address2 >& 4
9 exec 3<&-
10 exec 4<&-
read write命令总结:
Command | What it does |
---|---|
exec command | 该命令将取代当前shell环境并执行,不会再返回到当前shell环境了。 |
exec > data.txt | 打开data.txt并作为标准输出 |
exec < data.txt | 打开data.txt并作为标准输入 |
exec 3< data.txt | 打开data.txt作为输入,描述符设置为3 |
sort <&3 | 对data.txt执行sort操作 |
exec 4>data.txt | 打开data.txt作为输出,描述符设置为4 |
ll>&4 | 命令ll的输出被重定向到data.txt |
exec 6<&5 | 建立一个描述符5的拷贝6 |
exec 4&- | 关闭文件描述符4(不论是read还是write) |
35、调试模式.
通过设置执行参数-n,可以让shell不执行而是只进行语法检查。
设置执行参数-v,可以让shell在执行每条命令前先打印命令内容。
参数值 | 含义 |
---|---|
bash -n script_name | 只解释并分析语法错误,而不执行 |
bash -v script_name | 显示脚本中的命令 |
bash -x script_name | 显示脚本命令的执行堆栈,类似于函数调用的堆栈 |
bash -xv script_name | 同时打开-x -v |
bash +xv script_name | 关闭掉-x -v参数 |
36.set命令。
设置脚本参数的生效范围。
#-x参数只是在执行这一段代码时生效,参数可以是-f -v -n,含义与上面一致。
set -x
section of script
set +x
37、算术运算相关。
任何时候,我们在脚本里面声明一个变量,默认情况下,shell都是把该变量当做一个字符串。
declare -i value #声明一个整型变量
运算符语法格式:
$ value=4 + 4 # error
$ value=4+4#yes
$ value="4 + 4" #yes
$ value=4.5# error,不能将浮点数赋值给整数。
38.let:算术命令。
使用let命令,就不需要单独声明某个变量为整型了。
1 value=6
2 let value=value+1
3 echo $value
4
5 let "value=value+4"
6 echo $value
7
8 let "value+=1"
9 echo $value
39.expr:也是用来执行算术命令的。
expr 40 + 2 #42
expr 40+2# 40+2 如果想expr作用于算术运算,那么后面的表达式中的数字与运算符之间要留空格。
expr 40 / 10 # 4
expr 40 * 2 #error *要通过转义才被识别为乘号
expr 40 \* 2 # 80
例子:
1 x=5
2 y=2
3 z=`expr $x + $y`
4 echo $z
40、算术运算表达式。
两种格式都行:
$(( expression ))
[
e
x
p
r
e
s
s
i
o
n
]
和
e
x
p
r
表
达
式
的
明
显
区
别
就
是
不
用
在
变
量
前
面
加
[ expression ] 和expr表达式的明显区别就是不用在变量前面加
[expression]和expr表达式的明显区别就是不用在变量前面加符号。
1 x=5
2 y=2
3 z=$(( x + y ))
4 echo $z
1 x=5
2 y=2
3 z=$[ x + y ]
4 echo $z
稍微复杂点的表达式:如何计算计算a的b次方
a=5
b=3
c=$[ $a ** $b ] # 这个就表示a的b次方
echo $c
其他例子:
B=10
A=$[ B + 10]
echo $A
echo $[ 3 + 4 -5 ]
算术运算的优先级控制
echo $[(3 + 4) * 5]
涉及到交互运算的脚本:
1 echo "enter first value"
2 read number_1
3 echo "enter second value"
4 read number_2
5 total=`expr $number_1 + $number_2`
6 echo $total
7 sum=$((number_1 + number_2))
8 echo "sum is $sum"
9 echo "sum is $[ number_1 + number_2]"
判断一个输入数字是奇数还是偶数。
echo "Please enter a value"
read x
#三种运算书写方式。
y=`expr $x%2`
#y=$[ x%2 ]
#y=$((x%2))
if test $y -eq 0
then
echo "Entered number is even"
else
echo "Entered number is odd"
fi
41.数字的不同进制表示。
variable=base#number-in-that-base
#十进制21的不同表示方法
x=2#10101
x=8#25
x=16#15
42.浮点数运算。
在bashshell中,只能进行整数运算,如果要进行浮点数运算,就需要借助其他工具,如awk,bc
$ echo "scale=2;15/2" | bc
output:7.50 # scale代表设置的精度,既小数点后的位数
$bc #输入bc,会在当前shell中进入bc的命令行状态。
((83.12+32.13)*37.3)
43.$?
用来获取上一条shell命令的执行结果。也包括操作是否成功或者逻辑结果是否为true.
$ x=10;y=20;((x>y));echo $?
output:1
44.test
判断name的值是否为Ganesh
$ test $name = Ganesh
$ echo $?
也可以替换为[[]]
$ [[ $name = Ganesh]]
$ echo $?
$ [[ $name = [Gg]???? ]] #通配符匹配
$ echo $?
45.&& ||短路逻辑运算符
$ [[ $name == Ganesh && $friend == "John"]]
$ [ $name == Ganesh ] && [ $friend == "John"]
46.字符串比较的关键字
Test operator | Test true if |
---|---|
-n string | 字符串长度是否不为0. |
-z string | 字符串长度是否为0 |
string1 != string2 | 两个字符串是否不相等 |
string1 == string2 或者 string1 = string2 | 两个字符串是否相等 |
string1 > string2 或者 string1 < string2 | 比较字符串的大小 |
注意:= != 与字符串之间的空格不能省略。
47.数值的比较。
i1:integer_1
i2:integer_2
Test operator | Test true if |
---|---|
[ i1 -eq i2 ] | i1与i2相等 |
[ i1 -ne i2 ] | i1与i2不相等 |
[ i1 -gt i2 ] | i1大于i2 |
[ i1 -ge i2 ] | i1大于或等于i2 |
[ i1 -lt i2 ] | i1小于i2 |
[ i1 -le i2 ] | i1小于等于i2 |
[[ i1 > i2 ]] | i1小于i2 |
[[ i1 != i2 ]] | i1与i2不相等 |
[[ i1 == i2 ]] | i1与i2相等 |
[[ i1 && i2 ]] | 逻辑与 |
[[ i1 || i2 ]] | 逻辑或 |
test i1 -eq i2 | 使用test关键字 |
备注:[] [[]]可以使用test关键字替代
48.文件 目录相关命令。
Test operator | Tests true if |
---|---|
-b file_name | 是否为块文件 |
-c file_name | 是否为字符文件 |
-d file_name | 目录是否存在 |
-e file_name | 文件是否存在 |
-f file_name | 文件为普通文件,非目录 |
-G file_name | 文件存在,并且属于组用户 |
-L file_name | 文件是否为符号链接 |
-r file_name | 文件可读 |
-s file_name | 文件大小不为0 |
-w/x file_name | 文件可写.可执行 |
49.文件比较命令。
Test operator | Tests true if |
---|---|
[ file_1 -nt file_2] | 文件1比文件2新 |
[ file_1 -ot file_2] | 文件1比文件2旧 |
[ file_1 -ef file_2] | 文件1和文件2的inode相同 |
50.字符串逻辑测试。
Test operator | tests true if |
---|---|
[ string_1 -a string_2 ] | string_1和string_2都是true |
[ string_1 -o string_2 ] | string_1或者string_2都是true |
[ !string_1 ] | string_1未match到 |
[[ pattern_1 && pattern_2 ]] | pattern_1和pattern_2都是true |
[[ pattern_1 || pattern_2 ]] | pattern_1或者pattern_2都是true |
[[ !pattern_1 ]] | pattern_1未匹配到 |
字符串通配符匹配
name=Ganesh
[[ $name == [Gg]anesh ]]
[[ $name == [Gg]anesh && friend == "Lydia" ]]
echo $?
shopt -s extglob
city=Kannur
[[ $city == [Kk]a+(n)ur ]]
echo $?