在bash shell脚本中,我们要先了解三种执行顺序

顺序执行 (从左到右,从上到下的执行)

选择执行 (条件满足或者不满足的时候,才会执行某段结构)

循环执行 (重复执行某段结构)

今天所写的if 就是选择顺序,for就是循环执行

在if或者for中不可避免的要使用一些结构,还有一些运算方法,我先把这些列出来,方便以后使用。

算术运算方法:

1.$[expression]

其中的表达式可以是纯数字组成的,也可以使用变量引用变量值;在使用变量时,可以将$符号省略;

示例:

# echo $[3+4]

# NUM1=5 ; NUM2=4 ; echo $[NUM1*NUM2]

2.let VAR=EXPRESSION

根据算术表达式完成算术运算并赋值给指定的变量;

3.$((EXPRESSION))

其中的表达式可以是纯数字组成的,也可以使用变量引用变量值;在使用变量时,可以将$符号省略;

4.expr ARGU1 ARGU2 ARGU3

其中ARGU1和ARGU3必须是整数数值;ARGU2是算术运算符;

5.echo "EXPRESSION" | bc

6.bc <<< EXPRESSION

位置参数变量:

$0:命令的本身,对于脚本而言,就是该脚本的路径;

$1,$2.....$n:脚本后面通过命令行给脚本传递的命令行参数;

n>9时,引用该位置变量时,需要加{},即${10}

特殊变量:

$@:给出的所有位置参数的列表,当使用双引号引用时,每个参数作为单独的字符串存在;

$*:给出的所有位置参数的列表,当使用双引号引用时,整个参数列表被当做一个字符串;

$#:标识除去$0之外,整个命令行中有多少个参数;

shift命令,可以将$2->$1;

if语句:

if: if 命令; then 命令; [ elif 命令; then 命令; ]... [ else 命令; ] fi

if语句的单分支结构:

if 命令; then 命令;  fi

注意:是否会执行then后面的命令,取决于if后面的命令的执行状态返回值;

1.如果其返回值为真,则执行then后面的命令;

2.如果其但回执为假,则不执行then后面的命令;

建议在脚本中的书写格式:

if CONDITION ; then

STATEMENT

..

fi

if CONDITION ;

then

STATEMENT

..

fi

if语句的双分支结构:

if 命令; then 命令; else 命令; fi

注意:是否会执行then或else后面的命令,取决于if后面的命令的执行状态返回值;

1.如果其返回值为真,则执行then后面的命令;

2.如果其但回执为假,则执行else后面的命令;

建议在脚本中的书写格式:

if CONDITION ; then

STATEMENT

..

else

STATEMENT

..

fi

if CONDITION ;

then

STATEMENT

..

else

STATEMENT

..

fi

if语句的多分支结构:(不建议使用,太麻烦,我们可以用下边的方法,进行单个或者多个的嵌套解决)

if 命令; then 命令; [ elif 命令; then 命令; ]... [ else 命令; ] fi

注意:是否会执行then或else后面的命令,取决于if后面的命令的执行状态返回值或者elif后面的命令的执行状态返回值;

1.首先判断if后面的命令的状态返回值是否为真,如果为真,就执行then后面的语句;如果为假,就继续判断第一个elif后面的命令的执行状态返回值;

2.第一个elif后面的命令的执行状态返回值为真,就执行第一个elif语句中then后面的命令,否则,就继续判断第二个elif后面的命令执行状态返回值;

3.以此类推,会判断每个elif后面的命令的执行状态返回值是否为真,如果所有的if和elif后面的命令的执行状态返回值均为假,则执行else后面的语句;

建议在脚本中的书写格式:

if CONDITION ; then

STATEMENT

..

elif CONDITION2 ; then

STATEMENT

..

else ; then

STATEMENT

..

fi

if CONDITION ;

then

STATEMENT

..

elif CONDITION2 ; then

STATEMENT

..

else

STATEMENT

..

fi

注意:if的多分支结构,使用场景不多,而且有些时候,可以使用嵌套的单分支或双分支if结构代替if多分支结构;

嵌套的if结构:

if CONTITIONG1 ; then

if CONTITIONG2 ; then

if CONTITIONG3 ; then

STATEMENT

..

else

STATEMENT

fi

else

STATEMENT

fi

else

STATEMENT

fi

一个好的循环结构,必须包括两个重要的环节;

1.进入循环的条件:

在符合要求或满足条件时才开始循环;

2.退出循环的条件:

达到某个要求或符合某个条件时需要结束或终止循环的执行;

for循环:

1.遍历列表的循环:

为列表中的每个成员执行命令。

for 名称 [in 词语 ... ] ; do 命令; done

建议在脚本中书写的格式:

for VAR_NAME in LIST ; do

循环体

done

for VAR_NAME in LIST

do

循环体

done

注意:

VAR_NAME:任意指定的变量名称,变量的值是从LIST中遍历获取的各个元素;

LIST:for循环需要遍历的列表;可以通过以下方式生成列表;

1.直接给出列表;

2.纯整数列表;

1)花括号展开:

{FIRSTNUM..LASTNUM}

{FIRST,SECOND,THIRD,...,LAST}

2)seq命令

seq [OPTION]... LAST

seq [OPTION]... FIRST LAST

seq [OPTION]... FIRST INCREMENT LAST

3.花括号展开:

{FIRST..LAST}

4.命令的执行结果:

ls /etc

5.GLOBBING通配符

6.某些特殊变量的值:

$*,$@

循环体:

一般来说,循环体中应该能够用到VAR_NAME变量的值的命令或命令的组合;如果循环体中的命令并没有用到VAR_NAME变量的值的话,列表的元素个数,就是此次for循环的次数;

1.进入循环的条件,LIST中尚有未被取尽的元素;

2.退出循环的条件,LIST中的元素被取尽;

3.for循环几乎不会出现死循环;

4.在执行循环的过程中,需要将整个LIST载入内存,因此。对于大列表来说,可能会消耗比较多的内存及CPU资源;

简单的例子(Vim编辑内容)

1.传递一个字符串给脚本,脚本会将该字符串当作用户名,如果该用户不存在,则添加之并为其设置与用户名相同的密码。

#!/bin/bash

#

if [ $# -ne 1 ] ; then

echo "please input one name charast"

exit 6;

fi

if id $1 &> /dev/null ; then

echo "This user already exists"

else

useradd $1 &> /dev/null

echo $1 | passwd --stdin $1 &> /dev/null

echo "This user creat and password is username"

fi

2.将两个文本文件的路径传递给脚本作为其参数,如果有文件不存在,则结束脚本执行并报告错误信息;如果文件都存在,则比较两个文件中哪个文件的行数多,返回行数多的文件的文件名。

#!/bin/bash

#

read -p "Please input two files: " FILE1 FILE2

if ! cat $FILE1 &> /dev/null ; then

echo "please enter the first true path file"

exit 5

if ! cat $FILE2 &> /dev/null ;then

echo "please enter the second true path file"

exit 5

fi

fi

LINE1=$(cat $FILE1 | wc -l )

LINE2=$(cat $FILE2 | wc -l )

if [ $LINE1 -ne $LINE2 ] ; then

if [ $LINE1 -gt $LINE2 ] ; then

echo "$FILE1"

else

echo "$FILE2"

fi

else

echo "$FILE1 and $FILE2 are generally long"

fi

unset FILE1 FILE2 LINE1 LINE2

3.利用RANDOM变量随机生成十个数字,显示出这十个数字,并显示出其中的最大值和最小值。

#!/bin/bash

#

touch /tmp/math.txt

for I in $(seq 1 10) ; do

J=$RANDOM

echo  "$J "

echo "$J" >> /tmp/math.txt

done

K=$( sort -n /tmp/math.txt | head  -1)

L=$( sort -n /tmp/math.txt | tail  -1)

echo "laster $L ; leaster $K "

rm -rf /tmp/math.txt

exit 5

4.给脚本传递一个数字作为行总数,分别打印由*组成的最0小锐角朝上和朝下的等腰三角形以及菱形。

#!/bin/bash

#

read -p "enter one number: " INT

if [[ $INT =~ [^[:digit:]] ]] ; then

echo "please enter the number"

exit 5

fi

echo ”zheng sanjiao“

for I in $(seq  $INT) ; do

for J in $(seq  $[INT-I]) ; do

echo -n " "

done

for K in $(seq  $[2*I-1]) ; do

echo -n "*"

done

echo

done

echo "dao sanjiao"

for M in $(seq  $INT) ; do

for B in $(seq $[M-1]) ; do

echo -n " "

done

for N in $(seq $[2*(INT-M)+1]) ; do

echo -n "*"

done

echo

done

echo "lingxing"

if [ $[INT%2] -ne 0 ] ; then

INT2=$[(INT+1)/2]

for Q in $(seq  $INT2) ; do

for W in $(seq  $[INT2-Q]) ; do

echo -n " "

done

for E in $(seq  $[2*Q-1]) ; do

echo -n "*"

done

echo

done

for R in $(seq  $[INT2-1]) ; do

for T in $(seq $[R]) ; do

echo -n " "

done

for Y in $(seq $[2*(INT2-R)-1]) ; do

echo -n "*"

done

echo

done

exit 7

else

echo "qing shuru jishu >3"

fi

5.分别打印顺序和旋转的九九乘法表。

顺序的九九乘法表是正常的九九乘法表;

旋转的九九乘法表是第一行是1×1=1 1×2=2 1×3=3 1×4=4 ... 1×9=9; 第二行是2×2=4 2×3=6 2×4=8 ... 2×9=18; ... 第九行是9×9=81;

#!/bin/bash

#

for I in $(seq 1 9) ; do

for J in $(seq 1 $I) ;do

echo -ne "$I×$J=$[I*J]\t"

done

echo

done

for M in $(seq 1 9) ; do

for N in $(seq $M 9) ; do

echo -ne "$M×$N=$[N*M]\t"

done

echo

done

bashne java_bash脚本中 if 语句 和 for 语句使用方法相关推荐

  1. python中的main函数可以被其他文件调用么_Python中在脚本中引用其他文件函数的实现方法...

    在导入文件的时候,Python只搜索当前脚本所在的目录,加载(entry-point)入口脚本运行目录和sys.path中包含的路径例如包的安装地址.所以如果要在当前脚本引用其他文件,除了将文件放在和 ...

  2. Shell脚本中计算字符串长度的5种方法

    这篇文章主要介绍了Shell脚本中计算字符串长度的5种方法,来自于个人Shell脚本长期的开发经验,需要的朋友可以参考下 有时在Linux操作系统中需要计算某个字符串的长度,通过查询资料整理了下目前S ...

  3. bash脚本中出现[[:not found错误的解决方法

    bash脚本中出现[[:not found错误的解决方法--bash脚本总结1 今天在写脚本的时候,发生了一个奇怪的问题:在脚本中使用[[的时候报错"[[: not found". ...

  4. shell脚本中写hive的sql语句

    2.3 shell脚本中写hive语句 2.3.1 test.sh脚本内容 #!/bin/bash analysis_date=$1 #开始执行方法 #/opt/hive-2.3.5/bin/hive ...

  5. linux shell脚本字符串连接符,学习Linux shell脚本中连接字符串的方法

    这篇文章主要介绍了Linux shell脚本中连接字符串的方法,如果想要在变量后面添加一个字符,可以用一下方法: 代码如下: $value1=home $value2=${value1}"= ...

  6. 使用ToLua插件 关于Lua脚本中 require 添加模块经常报错找不到Lua文件的问题

    Lua的require添加模块经常报错,找不到 LuaException: E:/UnityProJect/Calculator/Assets/Script/Lua/NpcManage.lua:4: ...

  7. php 正则匹配 %3e,在shell脚本中使用正则表达式

    1)在Linuxshell脚本中使用正则表达式解析字符串的正确方法是什么? 包括正则表达式功能的工具包括sed.grep.awk.perl.python等等.即使是更新版本的bash也具有regex功 ...

  8. linux sftp账号密码脚本传文件,关于shell:如何使用Bash脚本中的密码运行sftp命令?...

    我需要从Linux主机使用sftp将日志文件传输到远程主机.我的操作组已为我提供了相同的凭据.但是,由于我无法控制其他主机,因此无法生成RSA密钥并与其他主机共享. 那么,有没有一种方法可以通过cro ...

  9. 如何获取shell脚本中某条语句的执行时间

    有没有办法获取shell脚本中某条语句的执行时间 如果要获得语句执行所花的时间 用time命令 在语句的前面加上time命令 输出结果一共3列 比如我执行time sleep 5 real    0m ...

最新文章

  1. vfp中,函数subs(计算机管理信息系统,7)返回的结果是,VFP选择题库(可发学生).xls...
  2. loadrunner-2-12日志解析
  3. centeros /redhate密码破解
  4. python sqlserver api连接池_非常老的话题 SQLSERVER连接池
  5. 不要为框架作过多的假设
  6. 2019第一篇万字长文!30+家一线投资机构已出投资新策略...
  7. 对数据进行插入操作并且获取主键的值
  8. [bzoj2301] [HAOI2011]Problem b
  9. 解决:Unable to identify index name. XXXModel is not a Document. Make sure the document class is annota
  10. java摆渡人,视频丨越野怪兽 JAVA 摆渡人(ANIMA)山地车
  11. Head First Java 中文高清版 免费分享
  12. 正确区分LJMP、AJMP、SJMP、JMP指令()
  13. 公司项目JAVA开发规范总结(七)——编程规范
  14. 英特尔 超核芯显卡 620mac_十代i9+3080显卡,男孩们的攒机快乐,还得拿出来显摆显摆!...
  15. 烟火高桥蝶变“中非商港”,开放雨花引领国际商贸
  16. kali 将系统文件夹名称设置为英文
  17. 一次迭代式开发的研究:一个迭代式项目计划
  18. 一个正整数 n ,求n!的末尾有几个0
  19. 网上涉廉政网络舆情信息工作怎么做的平台服务方案
  20. 一文看懂电容的种类及其在电路中的作用

热门文章

  1. android sim卡槽,一加5怎么装卡/插卡 一加手机5 SIM卡安装图文教程
  2. Linux 内核文件系统模块结构体关系图
  3. x射线计算机断层摄影设备参数,GB 17589—2011 X射线计算机断层摄影装置质量保证检测规范.pdf...
  4. 前端开发环境与最佳实践
  5. vue + gifshot 实现GIF动图
  6. 矩阵求和c语言通俗易懂
  7. 不同分辨率标准,720p 1080p 2k 4k HD FHD UHD
  8. caffe.bin caffe的框架
  9. 王者荣耀服务器维护9月27,王者荣耀9月27日更新维护公告 修复夏洛特技能bug等...
  10. 删除cookie删不掉的问题