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



上一篇下一篇

猜你喜欢

热点阅读