linux默认shell是bin/bash
, 流行的shell有ash, bash, tcsh, ksh, zsh等。
alias python='/path/to/python/python3'
unalias python
环境变量文件:
/etc/profile
/etc/bashrc
~/.profile
~/.bash_login
~/.bash_profile
~/.bashrc
ctrl+A
: 光标移动到开头。
ctrl+E
: 光标移动到结尾。
ctrl+C
: 强制终止。
ctrl+L
: 相当于clear.
ctrl+U
: 删除或剪切光标之前的内容。
ctrl+K
: 删除或剪切光标之后的内容。
ctrl+Y
: 粘贴剪切的内容。
ctrl+R
: 从历史命令中搜索。按下后会出现搜索界面。
ctrl+D
: 终结当前终端。
定义变量, 必须以字母或下划线开头:
var=value
引用变量:
# 1. method 1
var
# 2. method 2
{var}
var=`pwd`
# 3. method 3
echo $var
变量仅在当前shell
中有效。
export back_dir=/path
# 将自定义变量转为环境变量
export my_var
# 引用环境变量
var
{var}
# 查看环境变量
echo $var
# 取消环境变量
unset var
在当前shell
和子shell
中有效。
$1 $2 $3 $4 $5
$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)$
school=1000phone
echo "${school} is good."
# out: 1000phone is good
echo '${school} is good'
# out: $school is good.
反引号命令替换,相当于$()
,反引号中的shell命令会被先执行。
expr
: 每个参数都要空格。expr 1 + 2
a=1
b=2
expr $a + $b
expr $b \* $a # 乘法需要转义
echo $(($a + $b))
echo $((a+b))
sum=$((5-3*2))
echo $sum
echo $[5+2]
echo $[$a+$b]
let sum=$a+$b
echo $sum
echo ${var/val_1/val_2}
# 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
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
for val in arr
do
echo $val
done
for
每次从集合去一个值, do - done
执行命令。
while cond
do
command
done
until cond
do
command
done
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))
# 可用;分割,也可以换行写入就不需要;
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
使用$
符让命令在后台执行
for (( i=0; i<${count}; i++ ))
do
{
command
}&
done
wait # 需要加wait, 否则光标不结束不能回到terminal
使用wait
控制
for (( i=0; i<${count}; i++ ))
do
{
command
}&
done
wait
command