首页 > 代码库 > 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:执行方式、运行方式、变量、替换