Linux常用命令-shift

命令

shift

描述

移动位置参数,可用于传递多个参数

用法

1
shift [n]

选项

注意

如果需要同时指定选项和参数,如-a aa,则需要在case循环里添加shift,$1为选项-a,$2为参数aa
如果只需要指定选项,如-a -b,则只需要在case循环外添加shift即可,$1始终为选项
在case循环中只设置变量,而不要直接执行命令,建议在循环外判断变量值后再执行相应的命令

示例

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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
# bash脚本中可以通过shift传递多个参数
$ cat a.sh
echo num is $#
echo "all is $*"
while [ $# -gt 0 ]; do
echo $#
case $1 in
-a)
echo "-a is '$*'"
echo "-a \$12 is '$1' '$2'"
# 如果需要同时指定选项和参数,如-a aa,则需要在case循环里添加shift,$1为选项-a,$2为参数aa
# 如果只需要指定选项,如-a -b,则只需要在case循环外添加shift即可,$1始终为选项
shift
;;
-b)
echo "-b is $*"
echo "-b \$123 is $1 $2 $3"
# 在case循环中只设置变量,而不要直接执行命令,建议在循环外判断变量值后再执行相应的命令
#save_log=$1
#file_path=$2
shift
;;
-c)
echo "-c is $*"
shift
;;
*)
#echo "* is $*"
echo help
# 如果输入的参数无效则退出
#exit
;;
esac
shift
done

$ bash a.sh -a aa
num is 2
all is -a aa
2
-a is '-a aa'
-a $12 is '-a' 'aa'

$ bash a.sh -a aa -b bb -c cc
num is 6
all is -a aa -b bb -c cc
6
-a is '-a aa -b bb -c cc'
-a $12 is '-a' 'aa'
4
-b is -b bb -c cc
-b $123 is -b bb -c
2
-c is -c cc

$ bash a.sh -a aa -b bb -c cc -d dd
num is 8
all is -a aa -b bb -c cc -d dd
8
-a is '-a aa -b bb -c cc -d dd'
-a $12 is '-a' 'aa'
6
-b is -b bb -c cc -d dd
-b $123 is -b bb -c
4
-c is -c cc -d dd
2
help
1
help

# 注意两次shift分别为case循环和while循环,参数-d dd只执行了while循环中的shift
$ bash -x a.sh -a aa -b bb -c cc -d dd
+ echo num is 8
num is 8
+ echo 'all is -a aa -b bb -c cc -d dd'
all is -a aa -b bb -c cc -d dd
+ '[' 8 -gt 0 ']'
+ echo 8
8
+ case $1 in
+ echo '-a is '\''-a aa -b bb -c cc -d dd'\'''
-a is '-a aa -b bb -c cc -d dd'
+ echo '-a $12 is '\''-a'\'' '\''aa'\'''
-a $12 is '-a' 'aa'
+ shift
+ shift
+ '[' 6 -gt 0 ']'
+ echo 6
6
+ case $1 in
+ echo '-b is -b bb -c cc -d dd'
-b is -b bb -c cc -d dd
+ echo '-b $123 is -b bb -c'
-b $123 is -b bb -c
+ shift
+ shift
+ '[' 4 -gt 0 ']'
+ echo 4
4
+ case $1 in
+ echo '-c is -c cc -d dd'
-c is -c cc -d dd
+ shift
+ shift
+ '[' 2 -gt 0 ']'
+ echo 2
2
+ case $1 in
+ echo help
help
+ shift
+ '[' 1 -gt 0 ']'
+ echo 1
1
+ case $1 in
+ echo help
help
+ shift
+ '[' 0 -gt 0 ']'


# 需要关闭case循环中的shift
$ bash a.sh -a -b
num is 2
all is -a -b
2
-a $12 is '-a' '-b'
1
-b $12 is -b

# 需要开启case循环中的shift
$ bash a.sh -a aa -b bb
num is 4
all is -a aa -b bb
4
-a $12 is '-a' 'aa'
2
-b $12 is -b bb

# 示例
mirror=''
DRY_RUN=${DRY_RUN:-}
while [ $# -gt 0 ]; do
case "$1" in
--mirror)
mirror="$2"
shift
;;
--dry-run)
DRY_RUN=1
;;
--*)
echo "Illegal option $1"
;;
esac
shift
done
case "$mirror" in
Aliyun)
DOWNLOAD_URL="https://mirrors.aliyun.com/docker-ce"
;;
AzureChinaCloud)
DOWNLOAD_URL="https://mirror.azure.cn/docker-ce"
;;
esac