首页 > 代码库 > shell入门笔记1:执行方式、运行方式、变量、替换
shell入门笔记1:执行方式、运行方式、变量、替换
说明:
本文是关于http://c.biancheng.net/cpp/shell/的相关笔记
shell的两种执行方式
交互式(interactive) | 解释执行用户的命令,用户输入一条命令,Shell就解释执行一条。 |
批处理 (batch) |
用户事先写一个Shell脚本(Script),其中有很多条命令,让Shell一次把这些命令执行完,而不必一条一条地敲命令。 |
运行shell脚本的两种方法
作为可执行程序 | ./test.sh |
作为解释器参数 | /bin/bash test.sh |
注意:
1.作为可执行程序运行时
一定要写成./test.sh,而不是test.sh。
直接写test.sh,linux系统会去PATH里寻找有没有叫test.sh,
而当前目录通常不在PATH里,所以写成test.sh是会找不到命令的,
要用./test.sh告诉系统说,就在当前目录找。
第一行需写上#!/bin/bash,
“#!”(读shebang) 是一个约定好的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell。
通过这种方式运行bash脚本,第一行一定要写对,好让系统查找到正确的解释器。
2.作为解释器参数运行时
这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。
shell变量
定义变量 | 变量名=变量值 | 变量名和等号之间不能有空格 |
使用变量 | ${变量名} | 加花括号是为了帮助解释器识别变量的边界 |
只读变量 | readonly 变量名 | 使用readonly命令可以将变量定义为只读变量,只读变量的值不能被改变 |
删除变量 | unset 变量名 | 变量被删除后不能再次使用,unset命令不能删除只读变量 |
特殊变量
$n | 传递给脚本或函数的参数 | n是一个数字,表示第几个参数。例如,当前脚本的文件名是$0,第一个参数是$1,第二个参数是$2。 |
$# | 传递给脚本或函数的参数个数 | |
$* | 传递给脚本或函数的所有参数 | 被双引号(" ")包含时,将所有参数作为一个整体。 |
$@ | 传递给脚本或函数的所有参数 | 被双引号(" ")包含时,将所有参数分开。 |
$? | 上个命令的退出状态,或函数的返回值 | |
$$ | 当前Shell进程ID |
1 #命令行参数: 2 #运行脚本时传递给脚本的参数称为命令行参数。 3 #命令行参数用$n表示,例如,$1表示第一个参数,$2表示第二个参数,依次类推。 4 #$0表示当前脚本的文件名。 5 6 #!/bin/bash 7 8 echo "File Name: $0" 9 echo "First Parameter: $1" 10 echo "Second Parameter: $2" 11 12 echo "Total Number of Parameters: $#" 13 14 #$*和$@的区别:都表示传递给函数或脚本的所有参数。 15 #不被双引号(" ")包含时,都以"$1""$2"…"$n"的形式输出所有参数。 16 #被双引号(" ")包含时, 17 #"$*"会将所有的参数作为一个整体,以"$1$2…$n"的形式输出所有参数; 18 #"$@"会将各个参数分开,以"$1""$2"…"$n"的形式输出所有参数。 19 20 echo "Quoted Values: " 21 echo "\$*="$* 22 echo "\$@="$@ 23 echo "\"\$*\"=""$*" 24 echo "\"\$@\"=""$@" 25 echo "print each param from \$*" 26 for var in $* 27 do 28 echo "${var}" 29 done 30 echo "print each param from \$@" 31 for var in $@ 32 do 33 echo "${var}" 34 done 35 echo "print each param from \"\$*\"" 36 for var in "$*" 37 do 38 echo "${var}" 39 done 40 echo "print each param from \"\$@\"" 41 for var in "$@" 42 do 43 echo "${var}" 44 done 45 echo "print each param from \$@" 46 for var in $@ 47 do 48 echo "${var}" 49 done 50 echo "print each param from \"\$*\"" 51 for var in "$*" 52 do 53 echo "${var}" 54 done 55 echo "print each param from \"\$@\"" 56 for var in "$@" 57 do 58 echo "${var}" 59 done 60 61 #$?可以获取上一个命令的退出状态。 62 #所谓退出状态,就是上一个命令执行后的返回结果。 63 #退出状态是一个数字,一般情况下,大部分命令执行成功会返回0,失败返回1。 64 #不过,也有一些命令返回其他值,表示不同类型的错误。 65 #$?也可以表示函数的返回值。 66 echo "Return Value of the Previous Command: $?" 67 68 #$$表示当前Shell进程的ID,即pid。 69 echo "Current Shell Process ID: $$"
shell替换
如果表达式中包含特殊字符,Shell将会进行替换。
例如,在双引号中使用变量就是一种变量替换,转义字符也是一种替换,还有命令替换。
注:
echo默认不转义,也可以使用-E选项禁止转义,可以使用-e选项支持转义。
echo默认插入换行符,可以使用-n选项禁止插入换行符。
1 #命令替换: 2 #shell可以先执行命令,将执行结果暂时保存,在适当的地方输出。 3 #语法: 4 #`command` 5 6 #!/bin/bash 7 8 #date显示当前时间 9 DATE=`date` 10 echo "Date is ${DATE}" 11 12 #who显示目前登入系统的用户信息 13 #|管道符号 ,上个命令的输出作为下个命令的输入 14 #wc -l显示行数 15 USERS=`who | wc -l` 16 echo "Number of the logged in users is ${USERS}" 17 18 #uptime查看系统负载,信息显示依次为:现在时间、系统已经运行了多长时间、目前有多>少登陆用户、系统在过去的1分钟、5分钟和15分钟内的平均负载 19 #命令间用换行符或者;分隔 20 UP=`date;uptime` 21 echo "Uptime is ${UP}"
变量替换
变量替换可以根据变量的状态(是否为空、是否定义等)来改变它的值。
可以使用的变量替换形式:
${var} | 变量本来的值。 |
${var:-word} | 如果变量var为空或已被删除(unset),那么返回word,但不改变var的值。 |
${var:=word} | 如果变量var为空或已被删除(unset),那么返回word,并将var的值设置为 word。 |
${var:+word} | 如果变量var被定义,那么返回word,但不改变var的值。 |
${var:?message} | 如果变量var为空或已被删除(unset),那么将消息message送到标准错误输出,可以用来检测变量var是否可以被正常赋值。 若此替换出现在Shell脚本中,那么脚本将停止运行。 |
1 #!/bin/bash 2 3 echo ${var:-"Variable is not set"} 4 echo "1-Value of var is ${var}" 5 6 echo ${var:="Variable is not set"} 7 echo "2-Value of var is ${var}" 8 9 unset var 10 echo ${var:+"This is a default value"} 11 echo "3-Value of var is ${var}" 12 13 var="prefix" 14 echo ${var:+"This is a default value"} 15 echo "4-Value of var is ${var}" 16 17 echo ${var:?"Print this message"} 18 echo "5-Value of var is ${var}" 19 20 unset var 21 echo ${var:?"Print this message"} 22 echo "6-Value of var is ${var}"
shell入门笔记1:执行方式、运行方式、变量、替换
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。