Linux(ubuntu)(一) —— shell(一)(echo&shell变量&if语句&逻辑运算符&for循环&while循环&Until循环&Case选择语句&数组&函数)

2 篇文章 0 订阅
1 篇文章 0 订阅

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 <mnist_app.py
#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"

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值