1、变量和运算 (注:从上往下一步一步执行)
1.本地变量在用户现在的shell生命期的脚本中使用
variable-name=value 例如:test="test"
2.set显示本地所有的变量
3.设成只读变量:readonly variable-name 例如:test="cynric" 会出错
readonly命令可以查看所有的只读变量
4.变量替换
${Variable name} 显示实际值到variable name
${Variable name:+value} 如果设置了variable name,则显示value,否则为空
例如:echo ${test:+"abcd"} 显示abcd
echo ${cywosp:+"abcd"} 显示为空
${Variable name:?value} 如果未设置variable name,显示用户定义的错误信息value
例如:echo ${cywosp:?"no defined"} 显示no defined
echo ${test:?"no defined"} 显示test
${Variable name:-value} 如果未设置variable name,则显示其值value
例如:echo ${cywosp:-"no defined"} 显示no defined
echo ${test:-"no defined"} 显示test
${Variable name:=value} 如果未设置Varible name,则将其值赋为value并显示
例如:echo ${cywosp:="cywosp"} 显示cywosp
echo ${test:="test"} 显示test
5、变量的清除
unset variable-name 例如:unset cywosp
注:readonly的变量不能unset,所以readonly要谨慎使用
6、位置变量 (一般不超过10个)
位置变量表示$0,$1 ......$9
$0 表示脚本名 $1 ......$9是输入的参数值
例如1:
#!/bin/bash
#cynric
echo "第一个参数是:$0"
echo "第二个参数是:$1"
echo "第三个参数是:$2"
echo "第四个参数是:$3"
echo "第五个参数是:$4"
echo "第六个参数是:$5"
echo "第七个参数是:$6"
echo "第八个参数是:$7"
echo "第九个参数是:$8"
echo "第十个参数是:$9"
./cynric.sh A B C D E F
输出:
第一个参数是:./cynric.sh
第二个参数是:A
第三个参数是:B
第四个参数是:C
第五个参数是:D
第六个参数是:E
第七个参数是:F
第八个参数是:
第九个参数是:
第十个参数是:
例如2:
#!/bin/bash
#find
#在根目录下查询传入的文件
find / -name $1 -print
7、特殊变量
$# 传递到脚本的参数个数
$* 以一个但字符串显示所有向脚本传递的参数。与位置变量不同,此项参数可超过9个
$$ 脚本运行的当前进程号
$! 后台运行的最后一个进程的进程ID号
$@ 传递到脚本的参数列表,使用时加引号,并在引号中返回每个参数
$- 显示shell使用的当前选项,与set命令功能相同
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表示有错误。
例如:
#!/bin/bash
#cynric1
echo "第一个参数是:$0"
echo "第二个参数是:$1"
echo "第三个参数是:$2"
echo "第四个参数是:$3"
echo "第五个参数是:$4"
echo "第六个参数是:$5"
echo "第七个参数是:$6"
echo "第八个参数是:$7"
echo "第九个参数是:$8"
echo "第十个参数是:$9"
echo "显示参数个数: $#"
echo "显示脚本全部参数: $*"
echo "显示进程ID : $$"
echo "显示前一命令运行后状态: $?"
结果:
./cynric1.sh cynric 1 2 3
第一个参数是:./cynric1.sh
第二个参数是:cynric
第三个参数是:1
第四个参数是:2
第五个参数是:3
第六个参数是:
第七个参数是:
第八个参数是:
第九个参数是:
第十个参数是:
显示参数个数: 4
显示脚本全部参数: cynric 1 2 3
显示进程ID : 13002
显示前一命令运行后状态: 0
8、运算符类型
2 55:00
9、表达式替换
$[ ]和$( () ) 习惯使用$[ ],所有shell的求值都是用整数完成
$[ ]可以接受不同基数的数字
[ base#n ] n表示基数从2到36的任何基数。
例如:echo $[ 10#8 + 1 ] 结果为 9
echo $((10#8 + 1)) 结果为 9
2、输入输出
1、echo命令可以显示文本行或变量,或者把字符串输入到文件
echo [option] string
-e解析转义字符
-n回车不换行,Linux系统默认回车换行
-转义字符(/c, /f, /t, /n)
例如:echo -e "asdfsdfs/n/n/n"; 输出asdfsdfs并输出3个空行
2、read语句可以从键盘或文件的某一行文本中读入信息,并将其赋给一个变量。
read variable1 variable2...
如果只指定了一个变量,那么read将会把所有的输入赋给该变遇到第一个文件量,
直至遇到第一个文件结束符或回车;如果给出了多个变量,它们按顺序分别被赋
予不同的变量。shell将用空格作为变量之间的分隔符。
例如:
#!/bin/bash
#readname
echo -n "First Name:"
read firename;
echo -n "Last Name:"
read lastname subname
echo -e "Your First Name is: $(firstname)/n"
echo -e "Your Last Name is: $(lastname)/n"
echo -e "Your subname is: ${subname}/n"
结果:
First Name:cyn
Last Name:ric aaa
Your First Name is: cyn
Your Last Name is: ric
Your subname is: aaa
3、管道运算符
1、ls -l | grep "文件名" //列出特定文件的信息
ls -l | grep "readname.sh"
结果:
-rwxrwxrwx 1 root root 182 01-24 23:10 readname.sh
2、df -k | awk '{print $1}' | grep -v "文件系统"
df -k结果: //查看磁盘情况
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sda1 28439328 3802412 23168980 15% /
tmpfs 200776 0 200776 0% /dev/shm
.host:/ 31455236 21498088 9957148 69% /mnt/hgfs
df -k | awk '{print $1}'结果: //输出第一列
文件系统
/dev/sda1
tmpfs
.host:/
df -k | awk '{print $1}' | grep -v "文件系统" 结果:
/dev/sda1
tmpfs
.host:/
3、tee命令把输出的一个副本输送到标准输出,另一副本拷贝到相应的文件中
tee -a files //-a是追加到文件之后
如果希望在看到输出的同时,也将其存入一个文件,那么这个命令再适合不过了
一般用于管道之后。
4、重定向
cat >> text << China
> hello
> my name is cywosp
> China //输入China结束
cat text结果为:
hello
my name is cywosp
cat account_new.txt account_old.txt 1>account.out 2>account.err
把account_new.txt和account_old.txt中的内容输入到account.out中,如果
前面两个文件有某个不存在则把错误输入到account.err中
结果:
[root@localhost ShellStudy]# ls
account.err cynric1.sh find.sh text who2.out
account.out cynric.sh readname.sh who1.out who.out
[root@localhost ShellStudy]# cat account.out
[root@localhost ShellStudy]# cat account.err
cat: account_new.txt: 没有那个文件或目录
cat: account_old.txt: 没有那个文件或目录
5、grep "standard" standard.txt //在standard.txt中查找standard
6、exec命令
1 #!/bin/bash
2 # 使用'exec'重定向stdin.
3
4
5 exec 6<&0 # 将文件描述符#6与stdin链接起来.
6 # 保存stdin.
7
8 exec < data-file # stdin被文件"data-file"所代替.
9
10 read a1 # 读取文件"data-file"的第一行.
11 read a2 # 读取文件"data-file"的第二行.
12
13 echo
14 echo "Following lines read from file."
15 echo "-------------------------------"
16 echo $a1
17 echo $a2
18
19 echo; echo; echo
20
21 exec 0<&6 6<&-
22 # 现在将stdin从fd #6中恢复, 因为刚才我们把stdin重定向到#6了,
23 #+ 然后关闭fd #6 ( 6<&- ), 好让这个描述符继续被其他进程所使用.
24 #
25 # <&6 6<&- 这么做也可以.
26
27 echo -n "Enter data "
28 read b1 # 现在"read"已经恢复正常了, 就是能够正常的从stdin中读取.
29 echo "Input read from stdin."
30 echo "----------------------"
31 echo "b1 = $b1"
32
33 echo
34
35 exit 0
Linux Shell笔记 (一)
最新推荐文章于 2024-02-14 01:00:00 发布