分类: LINUX
2013-05-17 20:31:41
原文地址:Shell特殊字符 作者:xinyuwuxian
echo "The # here does not begin a comment." echo 'The # here does not begin a comment.' echo The \# here does not begin a comment. echo The # 这里开始一个注释. echo ${PATH#*:} # 参数替换, 不是一个注释. echo $(( 2#101011 )) # 数制转换, 不是一个注释.这里特别要注意第四个,一定要有空格,否则不认同是注释
;; case条件的结束
1.命令分隔,在一行中写多个命令 echo "aa" ; echo "bb"
2.在条件中的if和then如果放在同一行,也用;分隔
echo hello; echo there if [ -x "$filename" ]; then # 注意: "if"和"then"需要分隔. echo "File $filename exists."; cp $filename $filename.bak else echo "File $filename not found."; touch $filename fi; echo "File test complete."
首先,先举例说明一下"."作为source使用的实例
#!/bin/bash . data-file # 加载一个数据文件. # 与"source data-file"效果相同, 但是更具可移植性. # 文件"data-file"必须存在于当前工作目录, 因为这个文件是使用'basename'来引用的. echo "variable1 = $variable1" echo "variable3 = $variable3" let "sum = $variable2 + $variable4" echo "sum = $sum" exit 0上面是编写的include_file脚本,通过 . data-file引入,相当于c语言中的include data-file,我们看看data-file的内容
# 这是需要被脚本加载的数据文件. # 这种文件可以包含变量, 函数, 等等. # 在脚本中可以通过'source'或者'.'命令来加载. # 让我们初始化一些变量. variable1=22 variable2=474 variable3=5 variable4=97 message1="Hello, how are you?" message2="Enough for now. Goodbye."接下来我们看看脚本的执行结果:
root@ubuntu:~/resource/study/shell_study# chmod 777 include_file root@ubuntu:~/resource/study/shell_study# ls clear_log data-file include_file show_self root@ubuntu:~/resource/study/shell_study# ./include_file variable1 = 22 variable3 = 5 sum = 571上面的结果已经很有力的说明了我们想要的结论
.作为匹配字符说明如下:ab. 可以表示ab+任意字符,处理换行,并且必须是一个字符ab.不能表示ab
cd $LOG_DIR if [ `pwd` != "$LOG_DIR" ] then echo "Can't change to $LOG_DIR" exit $E_XCD fi
这里例子是最有力的的说明,在上一章中只不过没有到这个方法,这里pwd命令会返回当前路径,然后与LOG_DIR进行比较,同样你可以定义一个变量保存pwd返回的内容,比如:
path=`pwd`
1.空操作,等价于"NOP" (no op, 一个什么也不干的命令).
1 : 2 echo $? # 0 |
2.死循环: while :,可以被认为与shell的内建命令,与true作用相同.
while : do operation-1 operation-2 ... operation-n done # 与下边相同: # while true # do # ... # done |
3.在if/then中表示什么都不做,引出分支
if condition then : # 什么都不做,引出分支. else take-some-action fi
4.设置默认参数 : ${username=`whoami`}
: ${username=`whoami`} # ${username=`whoami`} 如果没有开头的":"的话, 将会给出一个错误, 除非"username"是一个命令或者内建命令
5.变量替换 : ${HOSTNAME?} ${USER?} ${MAIL?}
: ${HOSTNAME?} ${USER?} ${MAIL?} # 如果一个或多个必要的环境变量没被设置的话, 就打印错误信息.
如果文件不存在,将创建.
7.可能用来作为注释行, 虽然我们不推荐这么做. 使用#来注释的话, 将关闭剩余行的错误检查, 所以可以在注释行中写任何东西. 然而, 使用:的话将不会这样.root@ubuntu:~/resource/study/shell_study# ls clear_log data-file include_file show_self root@ubuntu:~/resource/study/shell_study# echo * clear_log data-file include_file show_self
(( t = a<45?7:11 )) # C语言风格的三元操作.
1.取变量的值 echo $PATH
var1=5 var2=23skidoo echo $var1 # 5 echo $var2 # 23skidoo
2.正则表达式中表示行的结尾
在, "$"表示行结束符,先分析一下下面的例子吧
root@ubuntu:~/resource/study/shell_study# echo slfjalj$fdjgl
slfjalj
3.${} 参数替换 ${PAHT}
#!/bin/bash 2 # param-sub.sh 3 4 # 一个变量是否被声明或设置, 5 #+ 将会影响这个变量是否使用默认值, 6 #+ 即使这个变量值为空(null). 7 8 username0= 9 echo "username0 has been declared, but is set to null." 10 echo "username0 = ${username0-`whoami`}"这里定义了username0且初始化是null,所以这里不会有输出,这里的“-”相当于“=” 11 # 不会有输出. 12 13 echo 14 15 echo username1 has not been declared. 16 echo "username1 = ${username1-`whoami`}"这里username1在上面没有定义并初始化为null,所以会显示 17 # 将会输出默认值. 18 19 username2= 20 echo "username2 has been declared, but is set to null." 21 echo "username2 = ${username2:-`whoami`}"这里上面初始化了username2并初始化为null,但是这里有个“:” 22 # ^ 23 # 会输出, 因为:-会比-多一个条件测试. 24 # 可以与上边的例子比较一下. 25 26 27 # 28 29 # 再来一个: 30 31 variable= 32 # 变量已经被声明, 但是设为空值. 33 34 echo "${variable-0}" # (没有输出) 35 echo "${variable:-1}" # 1 36 # ^ 37 38 unset variable 39 40 echo "${variable-2}" # 2 41 echo "${variable:-3}" # 3 42 43 exit 0我们也看看他的执行结果:
root@ubuntu:~/resource/study/shell_study# chmod 777 para_sub root@ubuntu:~/resource/study/shell_study# ls clear_log data-file include_file para_sub show_self root@ubuntu:~/resource/study/shell_study# ./para_sub username0 has been declared, but is set to null. username0 = username1 has not been declared. username1 = root username2 has been declared, but is set to null. username2 = root ^ 1 2 34.$* 所有参数
1.命令组,在一个子Shell中运行 (a=3;echo $a) 其中定义的变量在后面不可用
在括号中的变量,由于是在子shell中,所以对于脚本剩下的部分是不可用的. 父进程, 也就是脚本本身, , 也就是在子shell中创建的变量.
1 a=123 2 ( a=321; ) 3 4 echo "a = $a" # a = 123 5 # 在圆括号中a变量, 更像是一个局部变量. |
1 cat {file1,file2,file3} > combined_file 2 # 把file1, file2, file3连接在一起, 并且重定向到combined_file中. 3 4 5 cp file22.{txt,backup} 6 # 拷贝"file22.txt"到"file22.b |
#!/bin/bash # 从/etc/fstab中读行. File=/etc/fstab { read line1 read line2 read line3 } < $File echo "First line in $File is:" echo "$line1" echo echo "Second line in $File is:" echo "$line2" echo echo "third line in $File is:" echo "$line3" exit 0
执行结果:
root@ubuntu:~/resource/study/shell_study# ./test1 First line in /etc/fstab is: # /etc/fstab: static file system information. Second line in /etc/fstab is: # third line in /etc/fstab is: # Use 'blkid -o value -s UUID' to print the universally unique identifier
接下来看一个例子:
#!/bin/bash { echo "Just for a test:" echo `pwd` echo "Test end" } > "test-context" # 把代码块中的所有输出都重定向到文件中. echo "Results of rpm test in test-context" exit 0看看运行结果:
root@ubuntu:~/resource/study/shell_study# chmod 777 test2 root@ubuntu:~/resource/study/shell_study# ./test2 Results of rpm test in test-context root@ubuntu:~/resource/study/shell_study# ls clear_log include_file show_self test2 data-file para_sub test1 test-context root@ubuntu:~/resource/study/shell_study# cat test-context Just for a test: /root/resource/study/shell_study Test end
{ } \; 用在find的-exec中 $find -name *.txt -exec cat {} \;
[ ][i]<>filename 打开文件filename用来读写, 并且分配文件描述符i给这个文件. 如果filename不存在, 这个文件将会被创建.
如果管道中的某个命令产生了一个异常,并中途失败,那么这个管道将过早的终止. 这种行为被叫做broken pipe, 并且这种状态下将发送一个SIGPIPE 信号.
& 后台运行
看一个例子
#!/bin/bash # background-loop.sh for i in 1 2 3 4 5 6 7 8 9 10 # 第一个循环. do echo echo -n "$i " done & # 在后台运行这个循环. # 在第2个循环之后, 将在某些时候执行. echo # 这个'echo'某些时候将不会显示. for i in 11 12 13 14 15 16 17 18 19 20 # 第二个循环. do echo -n "$i " done echo # 这个'echo'某些时候将不会显示. exit 0看一下结果:
root@ubuntu:~/resource/study/shell_study# ./for_test 11 12 13 14 15 16 17 18 19 20 root@ubuntu:~/resource/study/shell_study# 1 2 3 4 5 6 7 8 9 10
- 在所有的命令内如果想使用选项参数的话,前边都要加上"-".
1.参数选项$IFS 用来做一些输入命令的分隔符, 默认情况下是空白
其中命令的很多细节并没有研究的很彻底,以后见到用到具体的命令再具体分析吧
待续。。。。