linux Shell 编程学习 2018-05-24

1,代码块和 I/O 重定向

vim test1.sh

#!/bin/bash 
# 从 /etc/fstab 中读行

File=/etc/fstab

{
 read line1
 read line2
} <$File

echo "First line in $File is:"
echo "$line1"
echo
echo "Second line in $File is:"
echo "$line2" 

exit 0

# 现在,你怎么分析每行的分割域
# 暗示: 使用 awk.

文件  /etc/fstab 内容 


效果:



2,在后台运行一个循环

vim test3.sh

  1  #!/bin/bash
  2  #background-loop.sh
  3 
  4  for i in 1 2 3 4 5 6 7 8 9 10 #第一个循环
  5  do
  6  echo -n " $i"
  7  done& #在后台运行这个循环
  8  #在第 2 个循环之后,将在某些时候执行.
  9 
 10  echo #这个'echo'某些时候将不会显示.
 11 
 12  for i in 11 12 13 14 15 16 17 18 19 20 #第二个循环
 13  do
 14  echo -n " $i"
 15  done
 16 
 17  echo #这个'echo'某些时候将不会显示.
 18 
 19  #--------------------------------------------------------
 20 
 21  #期望的输出应该是
 22  #1 2 3 4 5 6 7 8 9 10
 23  #11 12 13 14 15 16 17 18 19 20
 24 
 25  #然而实际的结果有可能是
 26  #11 12 13 14 15 16 17 18 19 20
 27  #1 2 3 4 5 6 7 8 9 10 bozo $
 28  #(第 2 个'echo'没执行,为什么?)
 29 
 30  #也可能是
 31  #1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
 32  #(第 1 个'echo'没执行,为什么?)

输出结果是:



3,变量赋值和替换

vim test4.sh

#!/bin/bash 
  2  # 变量赋值和替换
  3 
  4 a=375
  5 hello=$a
  6 
  7 # 强烈注意,在赋值的前后一定不要有空格.
  8 # 如果有空格会发生什么? 
  9 
 10 
 11 # 如果"VARIABLE =value",
 12 # ^
 13 #+ 脚本将尝试运行一个"VARIABLE"的命令,带着一个"=value"参数.
 14 
 15 # 如果"VARIABLE= value", 
 16 # ^
  1 #!/bin/bash 
  2  # 变量赋值和替换
 10 
 11 # 如果"VARIABLE =value",
 12 # ^
 13 #+ 脚本将尝试运行一个"VARIABLE"的命令,带着一个"=value"参数.
 14 
 15 # 如果"VARIABLE= value", 
 16 # ^
 17 #+ script tries to run "value" command with
 18 #+ 脚本将尝试运行一个"value"的命令,带着
 19 #+ the environmental variable "VARIABLE" set to "".
 20 #^Z+ 一个被赋成""值的环境变量"VARIABLE".
 21 #-------------------------------------------------------------------------
 22 
 23 # 没有变量引用,不过是个 hello 字符串
 27 echo ${hello} # 同上
 28 
 29 echo "$hello"
 30 echo "${hello}"
 31 
 32 echo
 33 
 34 hello="A B C D"
 35 echo $hello # A B C D
 36 echo "$hello" # A B C D
 37 # 就象你看到的 echo $hello 和 echo "$hello" 将给出不同的结果.   
 38 # ^ ^
 39 # Quoting a variable preserves whitespace.
 40 # 引用一个变量将保留其中的空白,当然,如果是变量替换就不会保留了. 
 41 
 42 echo
 43 
 44 echo '$hello' # $hello
 45 # ^ ^
 46 # 全引用的作用
 47 #+ 将导致"$"变成一个单独的字符.
 48 
 20 #^Z+ 一个被赋成""值的环境变量"VARIABLE".
 21 #-------------------------------------------------------------------------
 22 
 23 # 没有变量引用,不过是个 hello 字符串
 24 echo hello
 25 
 26 echo $hello
 27 echo ${hello} # 同上
 28 
 29 echo "$hello"
 30 echo "${hello}"
 31 
 32 echo
 33 
 34 hello="A B C D"
 35 echo $hello # A B C D
 36 echo "$hello" # A B C D
 37 # 就象你看到的 echo $hello 和 echo "$hello" 将给出不同的结果.   
 38 # ^ ^
 39 # Quoting a variable preserves whitespace.
 40 # 引用一个变量将保留其中的空白,当然,如果是变量替换就不会保留了. 
 41 
 42 echo
 43 
 44 echo '$hello' # $hello
 45 # ^ ^
 46 # 全引用的作用
 47 #+ 将导致"$"变成一个单独的字符.
 48 
 49 # 注意两种引用不同的效果
 50 
 51 
 52 hello= # 设置为空值
 53 echo "\$hello (null value) = $hello"
 54 # 注意设置一个变量为空,与 unset 它,不是一回事,虽然看起来一样
 55 #
 56 # --------------------------------------------------------------
 57 
 58 # 可以在同一行上设置多个变量.
 59 #+ 要以空白分隔
 60 # 小心,这会降低可读性,和可移植性.
 61 
 62 var1=21 var2=22 var3=$V3
 63 echo
 64 echo "var1=$var1 var2=$var2 var3=$var3"
 65 
 66 # 在老版本的"sh"上,可能会有问题.
 67 
 68 # -------------------------------------------------------------- 
 69 
 70 
 71 echo; echo
 72 
 73 numbers="one two three"
 74 # ^ ^
 75 other_numbers="1 2 3"
 76 # ^ ^
 77 # 如果变量中有空白,那么引用就必要了.
 78 #
 79 echo "numbers = $numbers"
 80 echo "other_numbers = $other_numbers" # other_numbers = 1 2 3
 81 echo
 82 
 83 echo "uninitialized_variable = $uninitialized_variable"
 84 # Uninitialized 变量为空值(根本就没赋值).
 85 uninitialized_variable= # 声明,但是没被初始化
 86 #+ 其实和前边设置为空值得作用是一样的.
 87 echo "uninitialized_variable = $uninitialized_variable"
 88 # 还是一个空值
 89 
 90 uninitialized_variable=23 # 赋值
 91 unset uninitialized_variable # Unset it.
 92 echo "uninitialized_variable = $uninitialized_variable"
 93 # 还是空值
 94 echo
 95 
 96   echo "$uninitialized" # (blank line)
 97 let "uninitialized += 5" # Add 5 to it.
 98 echo "$uninitialized" # 5
 99 
100 # 结论:
101 # 对于一个空值变量在做算术操作的时候,就好像它的值为 0 一样.
102 # This is undocumented (and probably non-portable) behavior.
103 # 这并没被文档化(可能是不可移植)的行为.
 96 exit 0

效果:


4,一般的变量赋值

vim test5.sh

1 #!/bin/bash
  2 # "裸体"变量
  3 
  4 echo
  5 
  6 # 变量什么时候是"裸体"的,比如前边少了$的时候.
  7 # 当它被赋值的时候,而不是被引用的时候.
  8 
  9 # 赋值
 10 a=879
 11 echo "The value of \"a\" is $a."  
 12 
 13 # 使用 let 赋值
 14 let a=16+5
 15 echo "The value of \"a\" is now $a."
 16 
 17 echo
 18 
 19 # 在 for 循环中
 20 echo -n "Values of \"a\" in the loop are: "
 21 for a in 7 8 9 11
 22 do
 23 echo -n "$a "
 24 done
 25 
 26 echo
 27 echo
 28 
 29 # 在 read 命令状态中
 30 echo -n "Enter \"a\" "
 31 read a
 32 
 33 echo "The value of \"a\" is now $a."
 34 echo
 35 
 36 exit 0


5,变量赋值,一般的和比较特殊的

vim test501.sh

 1  #!/bin/bash
  2 
  3 a=23 # Simple case
  4 echo $a
  5 b=$a
  6 echo $b
  7 
  8 # 现在让我们来点小变化
  9 
 10 a=`echo Hello!` # 把 echo 命令的结果传给变量 a
 11 echo $a
 12 # 注意,如果在命令扩展结构中使用一个(!)的话,在命令行中将不能工作
 13 #+ 因为这触发了 Bash 的"历史机制".
 14 # 但是,在校本里边使用的话,历史功能是被关闭的,所以就能够正常运行.
 15 
 16 
 17 a=`ls -l` # 把 ls -l 的结果给 a
 18 echo $a # 别忘了,这么引用的话,ls 的结果中的所有空白部分都没了(包括换行)
 19 echo
 20 echo "$a" # 这么引用就正常了,保留了空白
 21 # (具体参阅章节"引用")
 22 
 23 exit 0


5.2 整型还是 string?

vim test502.sh

 1 #!/bin/bash
 2 # int-or-string.sh: 整形还是 string?
 3
 4 a=2334 # 整型
 5 let "a += 1"
 6 echo "a = $a " # a = 2335
 7 echo # 还是整型
 8
 9
10 b=${a/23/BB} # 将 23 替换成 BB
11 # 这将把 b 变量从整型变为 string
12 echo "b = $b" # b = BB35
13 declare -i b # 即使使用 declare 命令也不会对此有任何帮助,9.4 节有解释
14 echo "b = $b" # b = BB35
15
16 let "b += 1" # BB35 + 1 =
17 echo "b = $b" # b = 1
18 echo
19
20 c=BB34
21 echo "c = $c" # c = BB34
22 d=${c/BB/23} # S 将 BB 替换成 23
23 # 这使得$d 变为一个整形
24 echo "d = $d" # d = 2334
25 let "d += 1" # 2334 + 1 =
26 echo "d = $d" # d = 2335
27 echo
28
29 # 关于空变量怎么样?
30 e=""
31 echo "e = $e" # e =
32 let "e += 1" # 算术操作允许一个空变量?
33 echo "e = $e" # e = 1
34 echo # 空变量将转换成一个整型变量
35
36 # 关于未声明的变量怎么样?
37 echo "f = $f" # f =
38 let "f += 1" # 算术操作允许么?
39 echo "f = $f" # f = 1
40 echo # 未声明的变量将转换成一个整型变量

4。3 位置参数

vim test503.sh

  1 #!/bin/bash
  2 
  3 # 作为用例,调用这个脚本至少需要 10 个参数,如
  4 # ./scriptname 1 2 3 4 5 6 7 8 9 10
  5 
  6 MINPARAMS=10
  7 echo
  8 
  9 echo "The name of this script is \"$0\"."
 10 # 添加./是为了当前目录
 11 
 12 # echo "The name of this script is \"`basename $0`\"."
 13 echo "The name of this script is \" `basename $0`\","
 14 # 去掉目录信息,具体见'basename'命令 
 15 
 16 echo
 17 
 18 if [ -n "$1" ] # 测试变量被被引用
 19 then
 20   echo  "Parameter #1 is $1" # "#"没被转义
 21 fi
 22 
 23 if [ -n "$2" ]
 24 then
 25   echo "Parmeter #2 is $2"  # 没被转义
 26 fi
 27 
 28 if [ -n "$3" ]
 29 then
 30   echo "Parmeter #3 is $3" # 没被转义
 31 fi
 32 
 33 if [ -n "$4" ]
 34 then
 35   echo "Parmeter #4 is $4" # 没被转义
 36 fi
 37 
 38 if [ -n "$5" ]
 39 then
 40   echo "Parmeter #5 is $5" # 没被转义
 41 fi
 42 
 43 if [ -n "$6" ]
 44 then
 45   echo "Parmeter #6 is $6" # 没被转义
 46 fi
 47 
 48 if [ -n "$6" ]
 49 then
 50   echo "Parmeter #6 is $6" # 没被转义
 51 fi
 52 
 53 if [ -n "$7" ]
 54 then
 55   echo "Parmeter #7 is $7" # 没被转义
 56 fi
 57 
 58 if [ -n "$8" ]
 59 then
 60   echo "Parmeter #8 is $8" # 没被转义
 61 fi
 62 
 63 
 64 if [ -n "$9" ]
 65 then
 66    echo "Parmeter #9 is $9" # 没被转义
 67 fi
 68 
 69 if [ -n "${10}" ]
 70 then
 71   echo "Parmeter #10 is ${10}" # 没被转义 # 大于 9 的参数必须出现在{}中. 
 72 fi
 73 
 74 echo "-----------------------------------"
 75 echo "All the command-line parameters are: "$*"" 
 76 
 77 if [ $# -lt "$MINPARAMS" ] #$#是传到脚本里的位置参数的个数
 78 then
 79 echo
 80 echo "This script needs at least $MINPARAMS command-line arguments!"
 81 fi
 82 
 83 echo
 84 
 85 exit 0



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值