linux shell 复习
2022-09-08 本文已影响0人
吉凶以情迁
{
// 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
快捷键
{
"key": "ctrl+b",
"command": "workbench.action.tasks.runTask",
"args": "compileRun"
},
测试代码
#!/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