1、非root(管理员)用户的符号会显示$
root(管理员)用户则会显示#(代表权力至高无上)
3、在Linux中,凡是被#!注释的,统统是加载器(解释器)的路径。
比如:
#!/bin/bash
#的意思是说,把下面文件的内容统统传递给/bin/bash
当然,还有很多。#!/bin/lua
#!/bin/perl
#!/bin/python
#!/bin/tcl
....其实这个就是声明用哪个程序来运行本文件。就是这个脚本用#!后面的命令来解释执行
4、使打印出来的语句显示颜色
echo -e "\033[32m-----------------------------------\033[1m"
会使打印出来的----------------显示颜色
1m是之后的命令都带颜色了
0m是只当前这句带颜色
6、 检查bash脚本程序运行是否报错
/bin/bash -n lian.py
如果没有反应就是没报错
7、
((i=$j+$k)) 等价于 i=`expr $j + $k`
((i=$j-$k)) 等价于 i=`expr $j - $k`
((i=$j*$k)) 等价于 i=`expr $j \* $k`
((i=$j/$k)) 等价于 i=`expr $j / $k`
echo
不换行输出
echo -n
输出到文件
echo $str >> output.txt
>>是追加
>是覆盖
output.txt可以没建,程序会自动建
read
从键盘等待用户输入
shell变量 / 传参
A=123 引用的时候就直接 $A
引用变量要加$符号
定义变量的时候A=123不能加空格,不然会报错
shell变量分为局部变量和环境变量。环境变量可以看做是系统已经定义好的,像echo $UID就是可以直接用的
shell常见的系统变量
- $0 当前程序的名称
- $n 当前程序的第n个参数(n=1,2,...,9)
- $* 当前程序的所有参数(不包括程序本身)
- $@ 当前程序的所有参数(不包括程序本身)
如果是${@:2} 这里指的就是从第2个参数之后的参数,例如
./lian.sh test1.txt test2.txt test3.txt
$@就是test1.txt test2.txt test3.txt,${@:2}就是test2.txt test3.txt
- $# 当前程序的参数个数(不包括程序本身)
- $? 命令或程序执行完后的状态,返回0表示执行成功
- $UID 当前用户的ID
- $PWD 当前所在的目录
$(dirname "$0") 切换到脚本所在的目录
- $0 表示当前脚本文件名;
- dirname 用于取指定路径所在的目录 ;如 dirname /usr/local/bin 结果为 /usr/local
- $(命令) 返回该命令的结果
echo "The /$? is $?"
加上反斜杠了就会输出$?
并且echo后面要加空格,如果直接跟echo""可能会报错
shell变量默认值
如果上面var这个变量已经有值了就用它的值,否则就用默认的string
var=${var:-string}
像这就是在设置默认值
通过脚本调用python程序,在脚本中指定python程序的参数
像这就是在shell脚本中
python -m torch.distributed.launch \ --nnodes=$NNODES \ --node_rank=$NODE_RANK \ --master_addr=$MASTER_ADDR \ --nproc_per_node=$GPUS \ --master_port=$PORT \ $(dirname "$0")/train.py \ $CONFIG \ --seed 0 \ --launcher pytorch ${@:3}
核心是 ${@:3} 即把脚本中传的参数作为python程序的参数
字符串+数字结合
#!/bin/bash for i in `seq 1 100` do user='user'$i done
注意=左右一定不能有空格
如果怕这种的话
用{}括起来,规定边界
是${1} 而不是{$1}
shell获取命令执行结果
files="$(ls)" echo $files
if语句
if (表达式) 语句1; then eif else 语句2 fi
if [ ! -f "$doiido" ]; then touch "$doiido" fi
两个小括号有计算的意思
两个中括号一般判大小判等之类的
一个中括号一般判断文件是否存在等
判断大小,做个计算,用两个括号
逻辑运算符解析
-f 判断文件是否存在 eg: if [ -f filename ]
-d 判断目录是否存在 eg: if [ -d dir ]
-eq 等于 应用于:整型比较
-ne 不等于 应用于:整型比较
-lt 小于 应用于:整型比较
-gt 大于 应用于:整型比较
-le 小于或等于 应用于:整型比较
-ge 大于或等于 应用于:整型比较
-a 双方都成立( and) 逻辑表达式
-o 单方成立( or ) 逻辑表达式
-z 空字符串
判断目录是否存在
if [ -d $DIR ];then
判断文件是否存在
if [ -f $FILE ];then
多个if条件判断
注意shell脚本中判断大小不能用大于小于号,只能用-gt这样
for循环语句
for 变量 in 字符串
do
语句1
done
在反引号``中的语句会当做命令来执行
案例1 打印seq数字循环
#!/bin/bash for i in `seq 10 30` do echo "num is $i" done
也可以写作
#!/bin/bash for i in `seq 1 100` do echo "num is $i" done
也可以写作直接在命令行执行
for i in `seq 1 100`;do echo "num is $i";done
expr命令是一个手工命令行计数器,用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符串
案例2 求1-100的和
#!/bin/bash j=0 for ((i=1;i<=100;i++)) do j=`expr $i + $j` done echo $j
注意这里等号左右不能加空格,否则就会报错
列表遍历
a=(1 2 3 4) for i in ${a[*]} do echo $i done
注意绝不能写成 a = (), 不能有多余的空格,会报错
while循环语句
while条件语句
do
语句1
done
i变量自增:
(i++)
案例1:while条件判断数字
#!/bin/bash i=1 while [[ $i -lt 10 ]] do echo $i ((i++)) done
案例2:while逐行读取某个文件
#!/bin/bash while read line do echo $line done
while true do gpustat 2>&1 | tee -a gpustat.txt sleep 1 done
Until循环语句
until 条件 do action done
案例1:数字条件判断
#!/bin/bash a=10 until [[ $a -lt 0 ]] do echo $a ((a--)) done
a++ 也可以写成 a=`expr $a + 1`
在阿里云主机上就是报错,不知道为何..................
Case选择语句
case $arg in
pattern1)
语 句 1
;;
pattern2)
语 句 2
;;
*)
语 句 3
;;
esac
数组
A=( test1
test2
test3
)
定义数组一般以括号的方式来定义, 数组的值可以随机定义。
echo ${A[0]},代表引用第一个数组变量(下标从0开始),test1
echo ${A[1]},代表引用第二个数组变量,test2
echo ${A[@]} 将显示所有参数 test1 test2 test3 。
echo ${#A[@]} 将显示该数组的参数个数 3。如果替换某个数组元素(例如替换第二个test2数组为 test5 )
echo ${A[@]/test2/test5}删除一个数组元素(例如删除test3数组)
unset A[2] ;
echo ${A[@]}#!/bin/bash soft=( nginx-1.6.1.tar.gz mysql-5.1.17.tar.gz php-5.3.3.tar.gz /etc/sysctl.conf ) echo ${soft[0]} echo ${soft[1]} echo ${soft[2]} echo ${soft[3]} echo ${soft[@]} echo ${#soft[@]}
数组添加元素
shell 数组没有追加函数, 可以利用数组的长度来追加元素
获取数组的长度:${#arr[*]}
list=() list[${#list[*]}]=1 list[${#list[*]}]=2 for i in ${list[*]} do echo $i done
数组转字符串
str='' for i in ${arr[@]};do str=$str$i; done
函数
第一个参数为 $1 !"
第十个参数为 $10 !"
第十个参数为 ${10} !"
参数总数有 $# 个!"
作为一个字符串输出所有参数 $* !"
案例1
#!/bin/bash demoFun(){ echo "this is my first shell function!" } echo "___________function begins start-----------" demoFun echo "-----------function finished---------------"
案例2 求阶乘
#!/bin/bash factorial(){ x=1 for((i=1;i<=10;i++)) do #x=`expr $x /* $i` ((x=$x*$i)) #let x*=$i done echo $x } factorial #-------------调用函数时传参---------------------------- #!/bin/bash factorial(){ x=1 for((i=1;i<=$1;i++)) do #x=`expr $x /* $i` ((x=$x*$i)) done echo $x } factorial 20 #----------------命令行调用时传参--------------------- #!/bin/bash factorial(){ x=1 for((i=1;i<=$1;i++)) do #x=`expr $x /* $i` ((x=$x*$i)) done echo $x } factorial $1
案例3:调用另一个文件中的函数
pra.sh 中调用lian.sh(作用就是求阶乘)
#!/bin/bash . lian.sh echo " use another function file"
返回值
用 $? 来获取返回值
但是返回值不能超过255
#!/bin/bash fun2() { read -p "enter num: " num return $((2*$num)) } fun2 echo "fun2 return value: $?"
改进:能超过255
#!/bin/bash fun2() { read -p "enter num: " num echo $((2*$num)) } result=`fun2` echo "fun2 return value: $result"