简书链接:linuxshell复习
文章字数:2061,阅读全文大约需要8分钟

plaintext
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
{
// See https://go.microsoft.com/fwlink/?LinkId=733558
// for the documentation about the tasks.json format
"version": "2.0.0",
"tasks": [
{
"label": "compileRun",
"type": "shell",

"command": "sh ${file} a b c d e f",
"args": [ //传递给命令的参数
{
"value": "",
"quoting": "escape" //指定对内容的escape
}
],
"presentation": {
"echo": false,//如果 为false,怎么执行命令是不会提示的,但是 程序里面的控制信息是会执行的.
"reveal": "always",
// "reveal": "never",//揭露 总是 显示信息不然搞毛.
"focus": false,
"panel": "shared",//面板就是每次启动的时候是否新开 dedicated专用 ,shared保留之前
"clear": true,//每次变异 是否清屏.
"showReuseMessage": false// 不是,true就提示enter,否则 还是需要按enter 就是提示那个英文而已但是并不会自动关闭
},
"group": {
"kind": "build",
"isDefault": true
}
}
]
}

sh.exe设置环境变量,一般电脑中都有这个程序。
image.png
快捷键

plaintext
1
2
3
4
5
{
"key": "ctrl+b",
"command": "workbench.action.tasks.runTask",
"args": "compileRun"
},

测试代码

plaintext
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
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333


#!/bin/sh
#cut --help
# cut -d 自定义分割富这里为; -f 表示指定取出哪个区域
A="1aaaa;2bbbb;3ccccc;4cccccc;5ddddd;6eeee;7fff;8ggggg;9h;10i;11j;12k;13l;14m;15n"
echo "分割取出 第6个 和 第1到3个"
echo $A | cut -d ';' -f 6,1-3; #1aaaa;2bbbb;3ccccc;6eeee
echo "分割取出第三个" #
echo $A | cut -d ';' -f 33ccccc
echo "分割取出第3到5个" #
echo $A | cut -d ';' -f 3-5 # 3ccccc;4cccccc;5ddddd
echo "分割取出 第一个 第5到7个"
echo $A | cut -d ';' -f 1,5-7 #1aaaa;5ddddd;6eeee;7fff

if true; then #为了让下面的代码不执行测试上面的代码这里。
exit;
fi

#逻辑分支
echo aa
if [ "aa" == "bb" ]; then
echo "equal bb"
else
echo "no"
fi
#echo $PATH
#ls -l /

#find / -name "*.exe"
#sh
#curl http://baidu.com
#定义数组
a=(A B "C" D)
echo $a
echo $a[0]
#switch判断
ACTION="fff"
case $ACTION in
start)
echo EXEC sTART
;;
end)
echo is end
;;
*)
echo is other
;;
esac

# [ -z "$2" ] 判断第几个参数是否为空的。如果第二个值为空,则执行...
# [ -z "$1" ] 如果第一个值为空,则xxxx
# [ -n "$2" ] 判断是否有"几个"参数。如果参数是两个的话,则执行...
# [ $? -eq 0 ] 判断上条语句执行是否正确,如果正确则...
# [ $# -eq 3 ] 位置参数是否为3,如果是3个则...

# -e filename 如果filename存在,则为真
# -d filename 如果filename为目录,则为真
# -f filename 如果filename为常规文件,则为真
# -L filename 如果filename为符号链接,则为真
# -r filename 如果filename可读,则为真
# -w filename 如果filename可写,则为真
# -x filename 如果filename可执行,则为真
# -s filename 如果文件长度不为0,则为真
# -h filename 如果文件时软连接,则为真
# filename1 -nt filename2 如果filename1比finame2新,则为真
# filename1 -ot filename2 如果filename1比filename2旧,则为真

# -eq 等于
# -ne 不等于
# -gt 大于
# -ge 大于等于
# -lt 小于
# -le 小于等于

# if [$string1 = $string2] 如果string1等于string2,则为真。字符串允许使用赋值号作为等号
# if [$string1 != $string2] 如果string1不等于string2,则为真
# if [-n $string] 如果string非空(非0),返回0(true)
# if [-z $string] 如果string为空,则为真
# if [$string] 如果string非空,返回0(和-n类似)
# if[!表达式] 条件表达式的相反
# if[!-d$num] 如果不存在目录$num
# if [表达式1 -a 表达式2] 条件表达式的并列 逻辑&&
# if[表达式1 -o 表达式2] 条件表达式的或 逻辑||

echo 进程pid:$$
echo 后台运行的PID:$!
ls xx
echo 当前脚本上一行出错代码:$? 如上面输入ls xx 代码执行错误了,这里那么就不为0 为 2
echo shell脚本传递过来的参数是 $@ 如执行 ./aa.sh a b c d 那么打印的是a b c d, # $@ 与$* 一样
echo 参数总数$#
echo 脚本名 $0
echo 第一个参数 $1
myarr=(A B "C" D)
echo 数组总数${#myarr[@]}
echo 数组总数${#myarr[*]}
echo 数组全部打印${myarr[@]}
echo 数组全部打印${myarr[*]}
echo 第1个元素${myarr[0]}

a=10
b=20

val=$(expr $a + $b)
echo "计算a+b结果$val "
val1=$(expr $a+$b)
echo "a + b无空格隔开则是字符串拼接,结果是: $val1"
echo -e "允许换行 \ n符号识别 \n"
echo -e "aaa \c" # 让aaa后面的bb跟到aaa前面, 如果没有-e 和\c 每一个echo都会默认换行的。
echo "bb"
echo "cc"
echo 时间$(date)

num1=200
num2=200
if test $((num1)) -eq $((num2)); then
echo '两个数相等!'
else
echo '两个数不相等!'
fi
num2=500

if test $((num1)) -lt $((num2)); then
echo "${num1}小于 ${num2}"
else
echo '不成立小于!' #如果单引号,则不支持变量引用
fi
num2=30
if test $((num1)) -gt $((num2)); then
echo "num1 ${num1}大于 num2${num2}"
else
echo "不成立大于!${num1}"
fi

# $$ Shell本身的PID(ProcessID,即脚本运行的当前 进程ID号)
# $! Shell最后运行的后台Process的PID(后台运行的最后一个进程的 进程ID号)
# $? 最后运行的命令的结束代码(返回值),即执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
# $- 显示Shell使用的当前选项,与set命令功能相同
# #∗ 和#@ 所 有 参 数 列 表
# $# 参数个数数量
# $0 就是编写的shell脚本本身的名字
# $1 是在运行shell脚本传的第一个参数
# $2 是在运行shell脚本传的第二个参数
# $0 Shell本身的文件名
# $1 ~ $n 添加到Shell的各参数值。$1是第1个参数,$2是第二个参数

# 移动文件
touch a.txt #创建空文件
touch e.txt
mv a.txt b.txt
cp b.txt c.txt
echo 当前文件txt内容
ls -l *.txt
mkdir aaa
cd aaa
touch aaa目录的文件.txt
echo 目录aaa 信息
cd ..
ls -l aaa

if test -d ./aaa; then
echo 'aaa目录存在!'
else
echo 'aaa目录不存在'
fi

if [ -d ./aaa ]; then
echo 'aaa目录存在使用[]语法!'
else
echo 'aaa目录不存在'
fi

rm -rf aaa #删除文件夹和内容
echo 删除完毕内容
# pwd# 当前目录 window sh不支持
ls -l *.txt

if test -e ./a.txt; then
echo 'a文件存在!'
else
echo 'a文件不存在!'
fi
if test -e ./b.txt; then
echo 'b文件存在!'
else
echo 'b文件不存在!'
fi

if test -f ./b.txt; then
echo 'b文件存在 且为普通文件!'
else
echo 'b文件不存在!'
fi

### 循环

for a in 1 2 3 4 5; do
echo "数组a当前 : $a"
done

C=(A B "C" D)
# 打印数组变量的方法
for temp in ${C[@]}; do
echo "数组C当前 : $temp"
done

int=1
while (($int <= 6)); do #这里固定2个括号
echo $int
# int++ #这种语法不支持
let "int++"
done

echo "输入一个数:"
num=22
start=10
start=10
# read num
for ((i = start; i <= $num; i++)); do
for ((j = 1; j <= $num; j++)); do
[ $j -le $i ] && printf "%d*%d=%-3d " ${i} ${j} $((i * j)) #判断j是否小于i,当
# [ $j -le $i ] && echo -n "${i}*${j}=$((i * j)) " #判断j是否小于i,当
done
echo "" #输出一个换行符
done

a=0

if [ $a -lt 6 ]; then
echo "$a小于6"
else
echo "$a 不小于6"
fi
# 这里要加上! 取反才能 成立,懵逼
until [ ! $a -lt 6 ]; do
echo $a
a=$(expr $a + 1)
done
aNum=7 #测试的时候屏蔽这句话 允许read aNum 这句话
while :; do
echo -n "输入 1 到 5 之间的数字: "
# read aNum
case $aNum in
1 | 2 | 3 | 4 | 5)
echo "你输入的数字为 $aNum!"
;;
7)
echo "跳出循环"
break
;;
*)
echo "你输入的数字不是 1 到 5 之间的! 你输入的是 $aNum 输入7跳出循环"
continue
echo "游戏结束" #本句话不会执行会重新走一遍逻辑
;;
esac
done

myfunc() {

echo "这是myfunction"
}
myfunc #执行函数

# printf "请输入十个数字:用空格隔开 "
# read
# echo "打印输入的$REPLY"

# biggest=$(echo "$REPLY" | tr ' ' '\n' | sort -rn | head -n1)
# smallest=$(echo "$REPLY" | tr ' ' '\n' | sort -rn | tail -n1)
# echo "最大的数字为: $biggest"
# echo "最小的数字为: $smallest"
#函数取返回值
returnFunc() {
return 333
}
returnFunc
echo "返回值是 $? !"

returnFun() {
echo 333
}
bbb=$(returnFun)
echo "取echo值 $bbb"

paramFunc() {
echo "参数1 $1 参数2 $2 参数个数$# "
}
paramResult=$(paramFunc "334" "bb")

echo "取带参数函数echo值 $paramResult"

# 声明函数,用来获取 shell 脚本的绝对路径
function get_script_path() {
# 获取脚本文件的父路径
local script_path=$(
cd $(dirname $0)
pwd
)
echo "父路径 $script_path" #貌似和直接 用 $(dirname $0) 本身没啥区别
# 获取脚本名
local script_name=$(basename $0)
# 返回脚本的绝对路径
echo "$script_path/$script_name"
}

# 调用函数,使用命令替换 $() 获取函数的返回值
path=$(get_script_path)
echo "当前脚本的绝对路径为:$path"

echo path:$(dirname $0)
echo 脚本名:$(basename $0)
pwd #获取当前目录
# cat 可以抓取临时文件也可以直接这样打印出来 多行
cat <<EOF
你的
我的
都是好的
黄瓜是最好的

EOF
echo over
#打印有几行
wc -l <<EOF
第一行
第二韩
方法
EOF
echo "ff" >/dev/null #你能看到打印的东西就见鬼了
# https://zhuanlan.zhihu.com/p/418357041



2022-12-18 14:58:06

eval巧用
定义文件名为frpc.sh
image.png

plaintext
1
2
3
4
5
6
7
8
9
10
param1=$*
echo 脚本名 $0
echo 参数个数 $#
echo 参数:$param1

for current in $*
do
echo 参数:$current
done
eval $param1