shell 变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
# 定义普通变量 只能由字母、数字、下划线组成,只能以字母或下划线开头
web_path=/home/wwwroot
web_path='/home/wwwroot'
web_path="/home/wwwroot"
web_path=$(pwd) # 命令执行结果赋给变量

# awk输出
web_tpye=123web_tpye='ropon'web_tpye="ropon"web_tpye=`pwd`
awk 'BEGIN {print "$test"}' $web_tpye $web_tpye$web_tpye $web_tpye
awk 'BEGIN {print $test}'
awk 'BEGIN {print '$test'}' 123 语法报错
awk 'BEGIN {print "'$test'"}' 123 roponropon ropon

# 特殊位置参数变量
# $0 获取当前执行shell脚本的文件名,如果执行脚本包含路径,那么就包含路径
# $n 获取当前执行shell脚本的第n个参数值,n=1...9 当n为0时表示脚本的文件名 n大于9 用${10...}表示
# $# 获取当前执行shell脚本接收参数的总个数
# $* 获取当前执行shell脚本所有参数,不加引号和$@相同 如果"$*" 表示将所有参数视为一个字符串 相当于"$1$2$3"
# $@ 获取当前执行shell脚本所有参数,不加引号和$*相同 如果"$@" 表示将所有参数视为不同字符串 相当于"$1""$2""$3"

# dirname 获取脚本的路径
dirname /root/studyshell.sh
# basename 获取脚本名字
basename /root/studyshell.sh

set -- 清除所有参数变量

set -- "My name" is Ropon
echo $#
echo $1
echo $2
echo $3

echo $*
echo $@

echo "$*"
echo "$@"

for i in $*; do echo $i; done
for i in $@; do echo $i; done

for i in "$*"; do echo $i; done
for i in "$@"; do echo $i; done 等价于 for i; do echo $i; done

$? 获取上一条指令执行状态返回值(0为成功,非零为失败)
$$ 获取当前执行shell脚本的进程号
$! 获取上一个在后台工作的进程的进程号
$_ 获取在此之前执行的命令或脚本的最后一个参数

sed -n '2,4p' studyshell.sh #查看studyshell.sh 第2到4行代码

echo -n 不换行输出内容
-e 解析转义字符
\n 换行
\r 回车
\t tab
\b 退格
\v 纵向tab

eval #语法 eval args
eval "echo \$$#"

exec #语法 eval 命令参数 不创建子进程前提下,去执行指定命令,执行完成后该进程就终止

read

shift #使用shift语句使用所有位置参数依次想左移动一个位置 $#值也会自动减1直到0为止
echo $1 $2
[ $# -eq 2 ] && shift && echo $1

exit

shell变量子串
${ropon}#返回$ropon的内容
${#ropon}#返回$ropon内容的长度(按字符)也适用于特殊变量
${ropon:offset}#返回在变量$ropon中,从位置offset之后开始提取子串到结尾
${ropon:offset:length}#返回在变量$ropon中,从位置offset之后开始提取长度为length的子串
${ropon#word}#返回在变量$ropon开头删除首次匹配word剩余的子串
${ropon##word}#返回在变量$ropon开头删除匹配word多次剩余的子串
${ropon%word}#返回在变量$ropon结尾删除首次匹配word剩余的子串
${ropon%%word}#返回在变量$ropon结尾删除匹配word多次剩余的子串
${ropon/pattern/string} #返回使用string代替第一个匹配的pattern(贪婪模式匹配)
${ropon//pattern/string} #返回使用string代替第所有匹配的pattern

ropon="abcABC123abcABCcaba"
echo ${ropon#a*C}#123abcABCcaba
echo ${ropon##a*C}#caba
echo ${ropon%c*a}#abcABC123abcABC
echo ${ropon%%c*a}#ab
echo ${ropon/abc/11} #11ABC123abcABCcaba
echo ${ropon//abc/11} #11ABC12311ABCcaba

shell特殊扩展变量
${ropon:-word}#如果ropon变量值为空或未定义,则返回word字符串
${ropon:=word}
#如果ropon变量值为空或未定义,则返回word字符串,但位置变量和特殊变量不适用,与${ropon:-word}用法相同,只不过将word赋给ropon
${ropon:?word}#如果ropon变量值为空或未定义,则word字符串作为标准错误输出,否则输出该变量的值
${ropon:+word}#如果ropon变量值为空或未定义,则什么都不做,否则wordp字符串替换变量值