简书链接:linuxshell复习 文章字数:2061,阅读全文大约需要8分钟
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设置环境变量,一般电脑中都有这个程序。 快捷键
1 2 3 4 5 { "key": "ctrl+b", "command": "workbench.action.tasks.runTask", "args": "compileRun" },
测试代码
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
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