标签归档:shell

Unix Shell控制结构—CASE

类似于其他高级程序语言,Shell中case语句的作用也是作为多项选择使用,语法如下:

case word in
  pattern1)
    Statement(s) to be execute if pattern1 matchs
    ;;
  pattern2)
    Statement(s) to be execute if pattern2 matchs
    ;;
  pattern3)
    Statement(s) to be execute if pattern3 matchs
    ;;
  *)
    Default action
    ;;
esac

有一点域其他高级语言中不太一样的地方,在高级语言中,若每个case后面没有break语句,

则此判断将会遍历所有的case,直至结束;而在shell中,若匹配了某个模式,则执行其中的命令;

执行完后(;;)直接退出此case;若无其他模式匹配输入,则将执行默认处理默认模式(*)部分。

pattern模式不能包含元字符:*、?、[..](类,如[a-z]等)

pattern模式里面可以包含或符号(|),表示多个匹配,如y|Y|yes|YES。

下面是一个简单的例子。

模拟一个计算器,进行+、-、*、/运算

#!/bin/ksh

echo ” Calculator”
echo “1.+”
echo “2.-“
echo “3.*”
echo “4./”

echo -n “Enter your choice :”
read I

case $I in
  1)
    echo “Enter the first number:”
    read A
    echo “Enter the second number:”
    read B
    echo “the result is:”
    echo ” $A + $B ” | bc
  ;;
  2)
    echo “Enter the second number:”
    read A
    echo “Enter the second number:”
    read B
    echo “the result is:”
    echo ” $A – $B ” | bc
  ;;
  3)
    echo “Enter the first number:”
    read A
    echo “Enter the second number:”
    read B
    echo “the result is:”
    echo ” $A * $B ” | bc
  ;;
  4)
    echo “Enter the first number:”
    read A
    echo “Enter the second number:”
    read B

Linux Shell脚本面试25问

Q:1 Shell脚本是什么、它是必需的吗?

答:一个Shell脚本是一个文本文件,包含一个或多个命令。作为系统管理员,我们经常需要使用多个命令来完成一项任务,我们可以添加这些所有命令在一个文本文件(Shell脚本)来完成这些日常工作任务。

Q:2 什么是默认登录shell,如何改变指定用户的登录shell

答:在Linux操作系统,“/bin/bash”是默认登录shell,是在创建用户时分配的。使用chsh命令可以改变默认的shell。示例如下所示:

  1. # chsh <用户名> -s <新shell>
  2. # chsh linuxtechi -s /bin/sh

Q:3 可以在shell脚本中使用哪些类型的变量?

答:在shell脚本,我们可以使用两种类型的变量:

  • 系统定义变量
  • 用户定义变量

系统变量是由系统系统自己创建的。这些变量通常由大写字母组成,可以通过“set”命令查看。

用户变量由系统用户来生成和定义,变量的值可以通过命令“echo $<变量名>”查看。

Q:4 如何将标准输出和错误输出同时重定向到同一位置?

答:这里有两个方法来实现:

方法一:

  1. 2>&1(如# ls /usr/share/doc >out.txt 2>&1)

方法二:

  1. &>(如# ls /usr/share/doc &>out.txt )

Q:5 shell脚本中“if”语法如何嵌套?

答:基础语法如下:

  1. if[条件]
  2. then
  3. 命令1
  4. 命令2
  5. …..
  6. else
  7. if[条件]
  8. then
  9. 命令1
  10. 命令2
  11. ….
  12. else
  13. 命令1
  14. 命令2
  15. …..
  16. fi
  17. fi

Q:6 shell脚本中“$?”标记的用途是什么? ?

答:在写一个shell脚本时,如果你想要检查前一命令是否执行成功,在if条件中使用“$?”可以来检查前一命令的结束状态。简单的例子如下:

  1. root@localhost:~# ls /usr/bin/shar
  2. /usr/bin/shar
  3. root@localhost:~# echo $?
  4. 0

如果结束状态是0,说明前一个命令执行成功。

  1. root@localhost:~# ls /usr/bin/share
  2. ls: cannot access /usr/bin/share:No such file or directory
  3. root@localhost:~# echo $?
  4. 2

如果结束状态不是0,说明命令执行失败。

Q:7 在shell脚本中如何比较两个数字 ?

答:在if-then中使用测试命令( -gt 等)来比较两个数字,例子如下:

  1. #!/bin/bash
  2. x=10
  3. y=20
  4. if[ $x -gt $y ]
  5. then
  6. echo x is greater than y
  7. else
  8. echo y is greater than x
  9. fi

Q:8 shell脚本中break命令的作用 ?

答:break命令一个简单的用途是退出执行中的循环。我们可以在while和until循环中使用break命令跳出循环。

Q:9 shell脚本中continue命令的作用 ?

答:continue命令不同于break命令,它只跳出当前循环的迭代,而不是整个循环。continue命令很多时候是很有用的,例如错误发生,但我们依然希望继续执行大循环的时候。

Q:10 告诉我shell脚本中Case语句的语法 ?

答:基础语法如下:

  1. case变量in
  2. 1)
  3. 命令1
  4. 命令2
  5. …..
  6. 最后命令
  7. !!
  8. 2)
  9. 命令1
  10. 命令2
  11. ……
  12. 最后命令
  13. ;;
  14. esac

Q:11 shell脚本中while循环语法 ?

答:如同for循环,while循环只要条件成立就重复它的命令块。不同于for循环,while循环会不断迭代,直到它的条件不为真。基础语法:

  1. while[条件]
  2. do
  3. 命令…
  4. done

Q:12 如何使脚本可执行 ?

答:使用chmod命令来使脚本可执行。例子如下:

  1. # chmod a+x myscript.sh

Q:13 “#!/bin/bash”的作用 ?

答:#!/bin/bash是shell脚本的第一行,称为释伴(shebang)行。这里#符号叫做hash,而! 叫做 bang。它的意思是命令通过 /bin/bash 来执行。

Q:14 shell脚本中for循环语法 ?

答:for循环的基础语法:

  1. for变量in循环列表
  2. do
  3. 命令1
  4. 命令2
  5. ….
  6. 最后命令
  7. done

Q:15 如何调试shell脚本 ?

答:使用’-x’参数(sh -x myscript.sh)可以调试shell脚本。另一个种方法是使用‘-nv’参数( sh -nv myscript.sh)。

Q:16 shell脚本如何比较字符串?

答:test命令可以用来比较字符串。测试命令会通过比较字符串中的每一个字符来比较。

Q:17 Bourne shell(bash) 中有哪些特殊的变量 ?

答:下面的表列出了Bourne shell为命令行设置的特殊变量。

内建变量 解释
$0 命令行中的脚本名字
$1 第一个命令行参数
$2 第二个命令行参数
….. …….
$9 第九个命令行参数
$# 命令行参数的数量
$* 所有命令行参数,以空格隔开

Q:18 How to test files in a shell script ?

Q:18 在shell脚本中,如何测试文件 ?

答:test命令可以用来测试文件。基础用法如下表格:

Test 用法
-d 文件名 如果文件存在并且是目录,返回true
-e 文件名 如果文件存在,返回true
-f 文件名 如果文件存在并且是普通文件,返回true
-r 文件名 如果文件存在并可读,返回true
-s 文件名 如果文件存在并且不为空,返回true
-w 文件名 如果文件存在并可写,返回true
-x 文件名 如果文件存在并可执行,返回true

Q:19 在shell脚本中,如何写入注释 ?

答:注释可以用来描述一个脚本可以做什么和它是如何工作的。每一行注释以#开头。例子如下:

  1. #!/bin/bash
  2. # This is a command
  3. echo I am logged inas $USER

Q:20 如何让 shell 就脚本得到来自终端的输入?

答:read命令可以读取来自终端(使用键盘)的数据。read命令得到用户的输入并置于你给出的变量中。例子如下:

  1. # vi /tmp/test.sh
  2. #!/bin/bash
  3. echo Please enter your name
  4. read name
  5. echo MyNameis $name
  6. # ./test.sh
  7. Please enter your name
  8. LinuxTechi
  9. MyNameisLinuxTechi

Q:21 如何取消变量或取消变量赋值 ?

答:“unset”命令用于取消变量或取消变量赋值。语法如下所示:

  1. # unset <变量名>

Q:22 如何执行算术运算 ?

答:有两种方法来执行算术运算:

1.使用expr命令(# expr 5 + 2) 2.用一个美元符号和方括号($[ 表达式 ])例如:test=$[16 + 4] ; test=$[16 + 4]

Q:23 do-while语句的基本格式 ?

答:do-while语句类似于while语句,但检查条件语句之前先执行命令(LCTT 译注:意即至少执行一次。)。下面是用do-while语句的语法

  1. do
  2. {
  3. 命令
  4. }while(条件)

Q:24 在shell脚本如何定义函数呢 ?

答:函数是拥有名字的代码块。当我们定义代码块,我们就可以在我们的脚本调用函数名字,该块就会被执行。示例如下所示:

  1. $ diskusage (){ df -h ;}
  2. 译注:下面是我给的shell函数语法,原文没有
  3. [function]函数名[()]
  4. {
  5. 命令;
  6. [returnint;]
  7. }

Q:25 如何在shell脚本中使用BC(bash计算器) ?

答:使用下列格式,在shell脚本中使用bc:

  1. variable=`echo “options; expression” | bc`

cat命令利用Linux重定向合并文件 http://www.linuxidc.com/Linux/2015-01/112122.htm

Shell编程浅析 http://www.linuxidc.com/Linux/2014-08/105379.htm 

Linux Shell参数替换 http://www.linuxidc.com/Linux/2013-06/85356.htm

Shell for参数 http://www.linuxidc.com/Linux/2013-07/87335.htm

Linux/Unix Shell 参数传递到SQL脚本 http://www.linuxidc.com/Linux/2013-03/80568.htm

Shell脚本中参数传递方法介绍 http://www.linuxidc.com/Linux/2012-08/69155.htm

Shell脚本传递命令行参数 http://www.linuxidc.com/Linux/2012-01/52192.htm

Linux Shell 通配符、转义字符、元字符、特殊字符 http://www.linuxidc.com/Linux/2014-10/108111.htm 

HP Unix 主机内存监控告警shell脚本

<

div id=”content” contentScore=”993″>HP Unix 主机内存监控告警shell脚本

memory_monitor.sh 脚本内容如下:
 
#告警阀值30G,少于则告警,频率 30分钟 检查一次
 normal=30
 
while :
 
do
 #取得总内存 
 
allmem=/usr/contrib/bin/machinfo|grep Memory|grep MB|awk '{print $2}'
 #取得内存分页数 
 
freemk=vmstat 5 2 | tail -n 1 | awk '{print $5}'
 #每一页是4K ,所以乘以4                             
 
freemm=expr $freemk \* 4;   
 #转换为 G                                                         
 
freemem=echo $freemm/1024/1024|bc;                                         
 
echo date +%Y%m%d%H%M”  Memory:” $allmem”M” all $freemem”G” avail;
 
if [ $freemem -lt $normal ]
 
then
 
    echo “当前内存”$freemem”G,少于”$normal”G”        #打印告警信恼/div>

利用shell网络流量监控

学习shell告一段落。开始那种信心满满,学过后才知道shell博大精深。学到只是一点皮毛。祖师爷一再教诲:学习这个没有什么窍门。要多练习,要有思路。有了思路,就会有一个解决办法。

今天课堂上讨论了一个练习,如何利用shell每十秒统计一次网络流量?

乍一听,统计流量感觉好难,无从下手。但是在老师的指导下,逐渐有了思路。

首先要采集到网络流量的数据。有了数据,求出流量差,就是网络流量了。那么数据去哪里找呢?

开始学习linux我们经常使用到ifconfig这条命令,来查看那网卡信息,主要是ip地址。其实呢,这信息里面就有通过当前网卡的数据流量。有发出的数据和收到的数据。

[root@www ~]# ifconfig eth0
 eth0      Link encap:Ethernet  HWaddr 00:0C:29:2F:59:46 
          inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe2f:5946/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:635 errors:0 dropped:0 overruns:0 frame:0
          TX packets:636 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:62050 (60.5 KiB)  TX bytes:61036 (59.6 KiB)
          Interrupt:59 Base address:0x2024
 
 
那么如何把需要的数据提取出来呢?
 
 [root@www ~]# ifconfig eth0|awk -F “:” ‘NR==8{print $2,$3}’
 F=($2+$3)就是在这一时刻,网络流量的总和。
 
间隔十秒在采集一次数据:S=($2+$3)。
 
计算两次采集到的数据差(S-F)就可以得到,这期间的流量。那么要每隔10s采集一次数据,怎么实现呢?这个是作为流量监控,还要不停地循环下去。
 
#!/bin/bash
 
while true;do
 
F=`ifconfig eth0|awk -F “:” ‘NR==8{print $2+$3}’`
      sleep 10
 
S=`ifconfig eth0|awk -F “:” ‘NR==8{print $2+$3}’`
      echo  $[($S-$F)/1024]
 
done
 

shell 判断变量为数字的N种方法

方法1:通过expr 计算变量与一个整数值相加,如果能正常执行则为整数,否则执行出错,$?将是非0的值
expr $args + 0 &>/dev/null

方法2:打印变量通过sed替换的方式,将变量中的数字替换为空,如果执行替换后变量为空,则为整数
echo $args | sed ‘s/[0-9]//g’
如果判断负数则再用sed过滤负号
echo $args | sed ‘s/[0-9]//g’ | sed ‘s/-//g’

下面的脚本通过两个函数来实现数值判断。代码很简单,就不加注释了。

#!/bin/bash
usage(){
cat <USEAGE:sh $0 args1 args2
exit 1
EOF
}
checkInt(){
        expr $1 + 0 &>/dev/null
        [ $? -ne 0 ] && { echo “Args must be integer!”;exit 1; }
}
checkInt1(){
        tmp=`echo $1 |sed ‘s/[0-9]//g’`
        [ -n “${tmp}” ]&& { echo “Args must be integer!”;exit 1; }
}
[ $# -ne 2 ]&&usage
args1=$1
args2=$2
checkInt $args1
checkInt1 $args2
if [ $args1 -gt $args2 ];then
        echo “yes,$args1 greate than $args2”
else
        echo “no,$args1 less than $args2”
fi

相关阅读

Linux Shell参数替换 http://www.linuxidc.com/Linux/2013-06/85356.htm

Shell for参数 http://www.linuxidc.com/Linux/2013-07/87335.htm

Linux/Unix Shell 参数传递到SQL脚本 http://www.linuxidc.com/Linux/2013-03/80568.htm

Shell脚本中参数传递方法介绍 http://www.linuxidc.com/L

Python 重定向shell执行输出

本文有两个主题:

1.python执行shell

os.system(“command line”)

2.重定向之后shell后的输出

def getkeyword(puretext):
    try:
      app = [‘java’,’-cp’,’IKAnalyzer2012_u6.jar:.’,’htParticiple’,’-f’,’acm.nyist.net’] #call the java programe
      proc = subprocess.Popen(app,stdout=subprocess.PIPE)                                #redirect the python out
      return proc.stdout.read()
 

Linux下C程序插入执行shell脚本

最近在看深入理解计算机系统,看到一个函数叫做execve(),这个函数很有意思,可以在一个进程插入另外一个进程执行,但是又不像fork()一样产生一个子进程,execve()插入的进程和原进程共享进程号,就好像执行这进程就像执行过程调用一般随意。

函数原型如下:

int execve(const char *filename, char *const argv[], char *const envp[]);

EXAMPLE
      The following program is designed to be execed by the second program below.  It just echoes its command-line one per line.

          /* myecho.c */

          #include
          #include

          int
          main(int argc, char *argv[])
          {
              int j;

              for (j = 0; j < argc; j++)
                  printf(“argv[%d]: %s\n”, j, argv[j]);

              exit(EXIT_SUCCESS);
          }

      This program can be used to exec the program named in its command-line argument:

          /* execve.c */

          #include
          #include
          #include

          int
          main(int argc, char *argv[])
          {
              char *newargv[] = { NULL, “hello”, “world”, NULL };
              char *newenviron[] = { NULL };

              if (argc != 2) {
                fprintf(stderr, “Usage: %s \n”, argv[0]);
                exit(EXIT_FAILURE);
              }

              newargv[0] = argv[1];

              execve(argv[1], newargv, newenviron);
              perror(“execve”);  /* execve() only returns on error */
              exit(EXIT_FAILURE);
          }

      We can use the second program to exec the first as follows:

          $ cc myecho.c -o myecho
          $ cc execve.c -o execve
          $ ./execve ./myecho
          argv[0]: ./myecho
          argv[1]: hello
          argv[2]: world
插入一个shell脚本执行:

#include
#include
#include

int
main(int argc, char *argv[])
{
    char *newargv[] = { “/etc” };
    char *newenviron[] = { NULL };
    if (argc != 2)
    {
        fprintf(stderr, “Usage: %s \n”, argv[0]);
        exit(EXIT_FAILURE);
    }

    newargv[0] = argv[1];

    execve(argv[1], newargv, newenviron);
    perror(“execve”);  /* execve() only returns on error */
    exit(EXIT_FAILURE);
}
script.sh如下:

#!/bin/bash
ls 执行:

./execve ./script.sh

会在当前终端下输出所有的文件

yca@Ubuntu:~/桌面/hello$ ./execve ./script.sh
1          execve    hello1    hello3      hello5      hello_lex
1.txt          execve.c    hello1.c  hello3.cpp  hello5.c  k_max
Bubble          hello    hello1.o  hello3.o    hello5.o  k_max.c
Bubble.c      hello.c    hello2.c  hello3.s    hello5.s  lex.yy.c
Quic

shell脚本应用及循环语句

一.bash通配符:
  1. ?//任意的单个字符
  2.*//0个或多个字符
  3. []      //区间内的任意一个字符
  4.;      //分割命令,忽略前一个命令的执行结果,继续执行后面的命令
  5.&      //后台执行程序
  6.&&      //前面的命令执行成功,返回值是0,执行后面的命令。
  7.||      //前面的命令执行失败,返回值非0,执行后面的命令。
  8. |      //管道
  9.()      //开启子shell,执行里面的命令
  10.{}      //里面的命令在当前shell执行
  11.> >>    //输出重定向
  12.< <<    //输入重定向
  13.$        //定义变量
  14.\        //转义;命令的折行
  15.“      //调用命令的执行结果;不可以嵌套
  16 .-        //连字符;命令的选项的前导, – —
  17. ” //强引用符号;屏蔽特殊字符
      18.””      //弱引用符号;“ $ \ 这3个符号屏蔽不了
      19.: //表示空操作,返回值永远是0;while循环
      20. [:alnum:]//字母+数字
      21[:alpha:] //字母
      22[:lower:]//小写字母
      23[:upper:] //大写字母
      24[:digit:] //十进制数
      25 [:punct:] //符号
      26 [:space:]//空白字符(空格 “tab”)
      27 [[:alnum:]] //任意的一个字母或数字[a-Z0-9]
      28 [^[:alnum:]] //取反
          [[:alnum:]!]

相关阅读:

Shell 循环语句用法小结 http://www.linuxidc.com/Linux/2012-02/54474.htm

Linux下Shell编程——awk编程 http://www.linuxidc.com/Linux/2013-06/85527.htm

Linux下Shell编程——sed命令基本用法 http://www.linuxidc.com/Linux/2013-06/85526.htm

Linux下Shell编程——grep命令的基本运用 http://www.linuxidc.com/Linux/2013-06/85525.htm

Linux下Shell编程——正则表达式基础与扩展 http://www.linuxidc.com/Linux/2013-06/85523.htm

二. 变量
1.注意
(1)=的两边千万不要有空格
(2)不要使用$作为变量的名字
(3)变量名的长度--256个字符,区分大小写
2.如何引用
(1)直接引用:
echo  命令
-e :启用\(反斜线)控制字符(\t \n)的转换
-n :取消换行符
[root@tx1 ~]# echo “123\t234”
123\t234
[root@tx1 ~]# echo -e “123\t234”
123    234
[root@tx1 ~]# echo -e “123\n234”
123
234
[root@tx1 ~]# echo -n “123\t234”
123\t234[root@tx1 ~]#
(2)间接引用
[root@tx1 ~]# a=b
[root@tx1 ~]# b=c
[root@tx1 ~]# echo $a
b
[root@tx1 ~]# echo ${!a}
c
(3)变量的作用域
@1在当前的shell里,定义的变量叫做本地变量-局部变量。
@2全局变量-环境变量,export 把局部变量变成全局变量。只作用于子shell。
[root@tx1 ~]# x=123
[root@tx1 ~]# echo $x
123
[root@tx1 ~]# bash
[root@tx1 ~]# echo $x

[root@tx1 ~]# exit
exit
[root@tx1 ~]# export x
[root@tx1 ~]# bash
[root@tx1 ~]# echo $x
123

(4)查看定义的变量
@1.set 查看所有的变量
@2.env 查看全局变量
@3.unset  取消变量 unset+变量名
@4.设置变量为只读: readonly+变量名

(5)位置参数$
注:位置参数,从命令行传递给脚本,或者是传递给函数.或者赋职给一个变量.
$0 命令本身
$1 $2 …… ${10}
$# 参数的个数
$* 所有的参数

$@ 所有的参数(需要被” ” 引用)
$$ 上一条命令的进程号
$? 上一条命令的返回结果
$_ 上一条命令的最后一个参数
$! 最后一个进入后台的命令的进程号
$() 等同于“
$(()) 等同于$[] 做数学运算的,但是只能算整数
(6)变量的置换
注:用来执行匹配或者是判断变量是否存在。
@1.${变量名:-字符串}:如果变量是空的,那么就返回字符串;否则返回变量的值
@2.${变量名:+字符串}:如果变量有值,那么使用字符串替换变量;否则返回空值
@3.${变量名:=字符串}:如果变量没有值,那么就把字符串赋值给变量;否则返回变量的值

@4.${变量名:?提示信息}:如果变量没有值,那么返回提示信息
@1.
[root@tx1 ~]# echo $a
[root@tx1 ~]# echo ${a:-123}
123
[root@tx1 ~]# b=abc
[root@tx1 ~]# echo ${b:-123}
Abc

@2.
[root@tx1 ~]# echo ${a:+123}
[root@tx1 ~]# echo ${b:+123}
123

@3.
[root@tx1 ~]# echo $a
[root@tx1 ~]# echo $b
abc
[root@tx1 ~]# echo ${a:=123}
123
[root@tx1 ~]# echo $a
123
[root@tx1 ~]# echo ${b:=123}
abc
[root@tx1 ~]# echo $b
Abc

@4.
[root@tx1 ~]# unset a
[root@tx1 ~]# echo ${a:?}
bash: a: parameter null or not set
[root@tx1 ~]# echo ${a:?没有设置变量}
bash: a: 没有设置变量
(7)变量的匹配模式
#:从变量的值的头部开始最小匹配,然后删除
## :从变量的值的头部开始最大匹配,然后删除
%  :从变量的值的尾部开始最小匹配,然后删除
%% :从变量的值的尾部开始最大匹配,然后删除
:num1:num2 :截取变量的值,num1是开始的位置,num2是截取出来几位;0是第一个字符
@1.
[root@tx1 ~]# echo ${pth#*/}
usr/bin/local/bin/all
[root@tx1 ~]# echo ${pth##*/}
all
@2.
[root@tx1 ~]# echo ${pth%/*}
/usr/bin/local/bin
[root@tx1 ~]# echo ${pth%%/*}

[root@tx1 ~]#
@3.
[root@tx1 ~]# echo ${pth:0:6}
/usr/b
[root

Shell中的循环语句实例

<

div id=”content” contentScore=”2351″>1.for循环语句
实例1.1 最基本的for循环

 #!/bin/bash

 for x in one two three four
 do
     echo number $x
 done
 

注:”for” 循环总是接收 “in” 语句之后的某种类型的字列表。在本例中,指定了四个英语单词,但是字列表也可以引用磁盘上的文件,甚至文件通配符。
实例1.2

#!/bin/bash
 for x in /var/log/*
 do
     #echo “$x is a file living in /var/log”
     echo $(basename $x) is a file living in /var/log
 done
 

注:这个$x获得的是绝对路径文件名;可以使用 “basename” 可执行程序来除去前面的路径信息。如果只引用当前工作目录中的文件(例如,如果输入 “for x in *”),则产生的文件列表将没有路径信息的前缀。
实例1.3 对位置参数做for循环

#!/bin/bash
 for thing in “$@”
 do
     echo you typed ${thing}.
 done

实例1.4 for循环中用seq产生循环次数

#!/bin/bash
for j in $(seq 1 5)
do
  echo $j
done

注:对于固定次数的循环,可以通过seq命令来实现,就不需要变量的自增了

2.while循环语句
实例2.1 循环输出1到10的数字

#!/bin/bash
 myvar=1
 while [ $myvar -le 10 ]
 do
     echo $myvar
     myvar=$(( $myvar + 1 ))
 done
 

注:只要特定条件为真,”while” 语句就会执行

3.until循环语句
实例3.1 循环输出1到10的数字
“Until” 语句提供了与 “while” 语句相反的功能:只要特定条件为假,它们就重复。下面是一个与前面的 “while” 循环具有同等功能的 “until” 循环。

#!/bin/bash
 myvar=1
 until [ $myvar -gt 10 ]
 do
     echo $myvar
     myvar=$(( $myvar + 1 ))
 done
 

 

还有一点非常重要,循环中难免会用到临时变量的自增,shell中变量自增的实现方法,见我前面的一个

Linux Shell中写循环时,常常要用到变量的自增,现在总结一下整型变量自增的方法。
我所知道的,bash中,目前有五种方法:
1. i=expr $i + 1;
2. let i+=1;
3. ((i++));
4. i=$[$i+1];
5. i=$(( $i + 1 ))
可以实践一下,简单的实例如下:
#!/bin/bash
i=0;
while [ $i -lt 4 ];
do
   echo $i;
   i=expr $i + 1;
   # let i+=1;
   # ((i++));
   # i=$[$i+1];
   # i=$(( $i + 1 ))
done

另外,对于固定次数缯div>

让进程在shell退出后仍继续运行

当在shell中运行一些监视工具或磁盘检查等任务时,往往需要很长时间,此时如果用户logout,这些程序都会收到SIGHUP信号从而终止,显然这样是不行的。

程序nohup和bash内建命令disown可以解决此问题。

1. nohup
nohup [command]
运行该指令之后,command在执行时将会忽略SIGHUP信号。
如果command中对标准输出没有重定向,nohup会将标准输出和标准错误输出到nohup.out文件,该文件存在当前目录下或home目录下。
此时用户logout,command仍然会继续运行

2.disown
disown -h