一,shell介绍
1,shell是外壳程序(区别于kernel),负责接收指令、调用内核执行程序、返回结果。它包围住内核,用户通过shell来操作内核,以此隐藏内核的复杂操作。
2,shell它有许多种解释器,如下图。bash就是其中一种。如在linux中。默认的是bin/bash
3,shell和终端(terminal终点站)的区别曾经电脑很贵,所以每个用户只分配一台终端,仅包括显示器和键盘,许多个终端连接在一台电脑上,用户在终端中输入命令,从而调用shell解释器。而现在则是每台电脑都会自带一个终端模拟器,windows中的是conhost.exe,打开它后,它会自动打开cmd。Pycharm下面的terminal选项卡也是一个终端,它默认连接的是windows中的powershell解释器。而这是可以切换的,setting->tool
4,(1)Windows中有两个自带的shell。①cmd(Command shell)②powershell。
(2)Bash只有linux系统上有。
(3)但是windows在安装了git之后,会有一个git bash。它基于cmd解释器,但是额外添加了对一些linux命令和git命令的支持。但是windows可能对调用自己cmd命令行控件的第三方应用设了限制,所以说git bash可以识别大部分cmd命令。
注:Cmd中输入where git bash就可以找到它的路径
二,在pycharm中直接运行.sh文件
(1)配置。点setting->tool->terminal->shell path。最后选中sh.exe。不要选bash.exe,因为这个程序最终还是要通过调用sh.exe来处理sh文件。
(2)sh文件的第一行一般都需要写“#!”后面接解释器的路径。写了之后,想要执行sh文件时直接写在终端输入“./xxx.sh”。如果sh文件中省略了解释器路径,就需要手动指定,写作“/bin/sh ./xxx.sh”
(3)如果选的是sh.exe,则新建一个sh文件时,不需要写“#!语句”了,可以直接执行。如果选中的是bash.exe则还需要写#!/bin/sh。
(4)在sh中每点一个运行,就会开启一个新的terminal窗口,所以一般在ternimal中按上箭头键,重复执行上一次的命令。在此处可直接切换shell解释器
三,sh脚本的语法
1,常用关键字
(1)打印echo。
echo "Hello Shell"
(2)exec:执行另一个 Shell 脚本
exec ./othershell.sh
(3)test:用于测试变量是否相等、 是否为空、文件类型等
2,变量
(1)定义变量
①普通变量:str1='hello'(定义字符串变量时,无空格情况下“”可以省略)
②只读变量:readonly AGE=21
(2)使用变量。${变量名}或者省略{}写作$变量名。
(3)显示变量长度(对于字符串变量):${#str1}
(4)定义的变量默认视为字符串,使用declare可以改变变量类型。!!改为整数是最常用的。定义sum=100+300+500,输出sum显示的是100+300+500,因为这个被视为字符串了。写成declare -i sum=100+300+500,输出sum才会是
900。
2,数组
(1)定义数组(各元素之间,空格隔开):array =(v0 v1 v2 v3)
(2)改变数组元素:array [2]=v22
(3)使用数组:echo ${array[2]}
(4)显示数组中所有元素,${array[*]}或${array[@]}
(5)获取数组长度:${#array[*或@]}
Ps,它也能用于求map中键值对个数
3,map类型,存储键值对,相当于python中的字典
(1)定义一个map。declare -A m=(["a"]="1" ["b"]="2")
(2)显示所有的key:${!m[@]}。显示所有value:${m[@]}
(3)输出某个key对应的value:${m["a"]}
(4)添加或改变元素:m["c"]="3"
4,环境变量
(1)对于sh脚本,它把环境变量视为一种默认定义好的变量,存在于环境中,脚本一启动就能直接用的。
(2)环境变量主要有:HOME:用户主目录、PATH:系统环境变量、TERM:当前终端、UID:当前用户 ID、PWD:当前工作目录,绝对路径
5,判断
(1)if的三种写法
(2)判断表达式[command]
①文件判断
[-d FILE ] 如果 FILE 存在且是一个目录则返回为真。
[-f FILE ] 如果 FILE 存在且是一个普通文件则返回为真。
②字符串判断
③数值判断
④逻辑判断
(3)case语句。画线的是可变内容,其余是固定写法。
6,循环(3种写法)
Break、continue也能用。
8,seq [OPTION] FIRST 步长 LAST。
相当于range,按顺序显示一些数,从first按步长显示到last。[OPTION]是可选参数,其中-s 指定分隔符。-w 等宽输出,用0填充达到宽度一样,相当于zerofill
9,read命令,接收用户输入,相当于input\scanf
read -p "请输入用户数字:" num1
-p后第一个参数写,输入前需要显示的字。第二个参数接收用户输入
四,函数
1,函数内部可以使用return,括号内可以定义形参。左图为定义、右图是调用。
五,调试shell
假设脚本为test.sh1。命令sh -n test.sh1会检查有无语法错误,无输出就是没错。
sh -x test.sh1是正式调试,它的输出中带+的是调试器输出,不带是程序输出(如echo)
六,执行一个py文件
1,从github中复制的,诸如...的语句,可以放到sh文件中。(\表示换行)
ps.\不可省略,--xx之间是以空格分割的,不是换行。所以不能省略\
python main_classification.py \
--task="$task" \
--config_json_file=../config/"$model"/"$task".json \
--weight_file=temp.pt \
--running_index="$running_index"
2,创建文件夹的命令,也是常用的
mkdir -p ../output/"$model"/"$running_index"