shell编程初级

1. shell分类

linux默认shell是bin/bash, 流行的shell有ash, bash, tcsh, ksh, zsh等。

2. 创建和取消别名

alias python='/path/to/python/python3'

unalias python

3. bash初始化

环境变量文件:

/etc/profile
/etc/bashrc
~/.profile
~/.bash_login
~/.bash_profile
~/.bashrc

4. 快捷键

ctrl+A: 光标移动到开头。
ctrl+E: 光标移动到结尾。
ctrl+C: 强制终止。
ctrl+L: 相当于clear.
ctrl+U: 删除或剪切光标之前的内容。
ctrl+K: 删除或剪切光标之后的内容。
ctrl+Y: 粘贴剪切的内容。
ctrl+R: 从历史命令中搜索。按下后会出现搜索界面。
ctrl+D: 终结当前终端。

5. 变量分类

5.1 自定义变量

定义变量, 必须以字母或下划线开头:

var=value

引用变量:

# 1. method 1
var

# 2. method 2
{var}
var=`pwd`

# 3. method 3
echo $var

变量仅在当前shell中有效。

5.2环境变量

export back_dir=/path

# 将自定义变量转为环境变量
export my_var

# 引用环境变量
var
{var}

# 查看环境变量
echo $var

# 取消环境变量
unset var

在当前shell和子shell中有效。

5.3 位置变量

$1 $2 $3 $4 $5

5.4 预定义变量

$0表示脚本名。$#参数的个数, $$当前进程的PID$?上一个进程的PID
$*所有参数, 会以一个整体$1 $2... $n的形式输出。$@所有的参数,会将各个参数分开,以$1, $2…的形式输出所有参数。

$0 这个程式的执行名字
$n 这个程式的第n个参数值,n=1…9
$* 这个程式的所有参数,此选项参数可超过9个。
$# 这个程式的参数个数
$$ 这个程式的PID(脚本运行的当前进程ID号)
$! 执行上一个背景指令的PID(后台运行的最后一个进程的进程ID号)
$? 执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
$- 显示shell使用的当前选项,与set命令功能相同
@ 跟 @ 跟 @*类似,但是可以当作数组用

变量赋值:

var=value
d=`date +%F`
d=$(date +%F)$

6. 变量引用

school=1000phone

echo "${school} is good."
# out: 1000phone is good

echo '${school} is good'
# out: $school is good.

反引号命令替换,相当于$(),反引号中的shell命令会被先执行。

7. 变量运算

7.1 整数运算

7.1.1expr: 每个参数都要空格。
expr 1 + 2

a=1
b=2

expr $a + $b

expr $b \* $a  # 乘法需要转义
7.1.2 $(())
echo $(($a + $b))
echo $((a+b))
sum=$((5-3*2))
echo $sum
7.1.3 $[]
echo $[5+2]
echo $[$a+$b]
7.1.4 let
let sum=$a+$b
echo $sum

8. 变量内容替换

echo ${var/val_1/val_2}

9. shell的函数

# method 1
function func_name {
	commands
    return value
}

# method 2
name(){
	commands
    return value
}

也可以使用echo返回函数值。

执行不带参数的函数:

func_name

执行带参数的函数:

func_name(){
	$((sum=$1+$2))
    return sum
}

func_name arg1 arg2

9. 定义数组

arr=(val1, val2, val3, val4)  # =两边不能有空格

# 产生1到10的整数
a=$( seq 1 10 )
a=({1..10})

#组截取
${arr[@]:0:3}  # 从下标为0开始取3个

键值对定义:

arr=([0]=val1 [1]=val2 [2]=val3)

数组遍历:

for (( i=0; i<${#arr[@]}; i++))
do
	echo ${arr[i]}
done

for var in ${arr[@]}
do

	echo $var
done

多个for循环嵌套

rounds=(round1 round2 round3 round4)
pretrained_models=(random mg moco pgl sar)
folds=(0 1 2)

for round in ${rounds[@]}
do
  for pre in ${pretrained_models[@]}
    do
      for fold in ${folds[@]}
        do
          echo $round $pre $fold
        done
    done
done

10 shell循环

for val in arr
do
	echo $val
done

for每次从集合去一个值, do - done执行命令。

while cond
do
	command
done

until cond
do
	command
done

11. 条件测试

test - dir: 利用test测试,test与表达式之间至少一个空格。
[ d dir ]件测试表达式[]与表达式之间至少一个空格。 []]: 通过[[]]双中括号测试,至少一个空格。 (())`: 通过双小括号测试,两端不需要空格,常用于整数对比。

(()): 数值比较, 运算
[[]]: 条件测试,支持正则
$(()): 整数运算

$[] 复数运算
$() 命令替换, shell先执行括号中的cmd, 然后将结果作为变量进行替换。错误输出不能替换。
-d dir: 文件存在且为目录
-f file: 文件存在且为文件
-e file: 文件存在
-s file: 文件存在且大小不为0
-r file: 文件存在且可读
-w file: 文件存在且可写
-x file: 文件存在且可执行
-L file: 文件存在且为链接
f1 -nt f2: 文件f1比f2新
f1 -ot f2: 文件f1比f2老

C语言风格:

((1<2))
(($a=0))

12 条件语句


# 可用;分割,也可以换行写入就不需要;
if [ cond ]; then
	command
fi

if [ cond ];then
	command
else
	command
fi

if [ cond1 ];then
	command
elif [ cond2 ];then
	command
elif [ cond3 ];then
	command
else
	command
fi

13 并发控制

使用$符让命令在后台执行

for (( i=0; i<${count}; i++ ))
do
{
	command
}&
done
wait  # 需要加wait, 否则光标不结束不能回到terminal

14 并发等待

使用wait控制

for (( i=0; i<${count}; i++ ))
do
{
	command
}&
done
wait
command
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值