Bash编程实例学习总结

本文详细介绍了Bash编程,包括变量定义与引号作用、环境变量引用与扩展、导出环境变量、删除环境变量、字符串操作如basename和dirname、命令替换、截断字符串、布尔表达式、参数传递、条件运算符以及循环结构。通过示例展示了Bash脚本中的关键概念,帮助读者深入理解Bash编程。
摘要由CSDN通过智能技术生成
1:定义,引号的作用
$ myvar='This is my environment variable!'
当定义的环境变量值多于一个字时(包含空格或制表键),必须用引号;
通常可以用双引号来替代单引号,区别在于使用单引号禁用了称为扩展的 bash 特性,其中,特殊字符和字符系列由值替换。
2引用,{}的作用
$ echo foo$myvarbar
foo
$ echo foo${myvar}bar
fooThis is my environment variable!bar
解释:bash 变量扩展设施陷入了困惑。它无法识别要扩展哪一个变量:$m、$my、$myvar还是$myvarbar?
当环境变量没有用空白(空格或制表键)与周围文本分开时,须用明确的花括号形式。
3:导出环境变量,则它可以自动地由以后运行的任何脚本或可执行程序环境使用。
myvar.c程序清单
#include <stdio.h>
#include <stdlib.h>
int main(void) {
  char *myenvvar=getenv("EDITOR");
  printf("The editor environment variable is set to %s/n",myenvvar);
}
以下是shell命令
$ ./myenv
The editor environment variable is set to (null)
$ EDITOR=xemacs
$ ./myenv
The editor environment variable is set to (null)
$ export EDITOR
$ ./myenv
The editor environment variable is set to xemacs
4:除去环境变量
$ unset EDITOR
$ ./myenv
The editor environment variable is set to (null)
5:截断字符串:basename和dirname
$ basename /usr/local/share/doc/foo/foo.txt
foo.txt
$ basename /usr/home/drobbins
drobbins
$ dirname /usr/local/share/doc/foo/foo.txt
/usr/local/share/doc/foo
$ dirname /usr/home/drobbins/
/usr/home
6:命令替换,$( )或``的使用
$ MYDIR=`dirname /usr/local/share/doc/foo/foo.txt`
$ echo $MYDIR
/usr/local/share/doc/foo
在第一行,简单地将要执行的命令以 反引号 括起。那不是标准的单引号,而是键盘中通常位于 Tab 键之上的单引号。可以用 bash 备用命令替换语法来做同样的事:
$ MYDIR=$(dirname /usr/local/share/doc/foo/foo.txt)
$ echo $MYDIR
/usr/local/share/doc/foo
使用命令替换可以将任何命令或命令管道放在 ` ` 或 $( ) 之间,并将其分配给环境变量。
7:专业截断字符串,${}
(1)##+通配符和#+通配符
$ MYVAR=foodforthought.jpg
$ echo ${MYVAR##*fo}
rthought.jpg
$ echo ${MYVAR#*fo}
odforthought.jpg
(2)%%+通配符和%+通配符
$ MYFOO="chickensoup.tar.gz"
$ echo ${MYFOO%%.*}
chickensoup
$ echo ${MYFOO%.*}
chickensoup.tar
(3)根据特定字符偏移和长度使用另一种形式的变量扩展,来选择特定子字符串
$ EXCLAIM=cowabunga
$ echo ${EXCLAIM:0:3}
cow
$ echo ${EXCLAIM:3:7}
abunga
8:布尔表达式,方括号[]。
一个检查文件后缀的脚本
#!/bin/bash
if [ "${1##*.}" = "tar" ]
then
    echo This appears to be a tarball.
else
    echo At first glance, this does not appear to be a tarball.
fi
9:接收自变量,$0,$1,$2,$@,$#
 #!/usr/bin/env bash
 echo name of script is $0
 echo first argument is $1
 echo second argument is $2
 echo all argument is $@
 echo number of arguments is $#
10:运算符       描述                   示例
文件比较运算符
-e filename     如果 filename存在,则为真     [ -e /var/log/syslog ]
-d filename     如果 filename为目录,则为真     [ -d /tmp/mydir ]
-f filename     如果 filename为常规文件,则为真     [ -f /usr/bin/grep ]
-L filename     如果 filename为符号链接,则为真     [ -L /usr/bin/grep ]
-r filename     如果 filename可读,则为真     [ -r /var/log/syslog ]
-w filename     如果 filename可写,则为真     [ -w /var/mytmp.txt ]
-x filename     如果 filename可执行,则为真     [ -L /usr/bin/grep ]
filename1-nt filename2 如果 filename1比 filename2新,则为真 [ /tmp/install/etc/services -nt /etc/services ]
filename1-ot filename2 如果 filename1比 filename2旧,则为真 [ /boot/bzImage -ot arch/i386/boot/bzImage ]
字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法)
-z string     如果 string长度为零,则为真     [ -z "$myvar" ]
-n string     如果 string长度非零,则为真     [ -n "$myvar" ]
string1= string2     如果 string1与 string2相同,则为真 [ "$myvar" = "one two three" ]
string1!= string2     如果 string1与 string2不同,则为真 [ "$myvar" != "one two three" ]
算术比较运算符
num1-eq num2     等于                 [ 3 -eq $mynum ]
num1-ne num2     不等于                 [ 3 -ne $mynum ]
num1-lt num2     小于                  [ 3 -lt $mynum ]
num1-le num2     小于或等于              [ 3 -le $mynum ]
num1-gt num2     大于                  [ 3 -gt $mynum ]
num1-ge num2     大于或等于              [ 3 -ge $mynum ]
示例:
if [ "$myvar" -eq 3 ]
then
     echo "myvar equals 3"
fi
 
 if [ "$myvar" = "3" ]
then
     echo "myvar equals 3"
fi
上面两个比较执行相同的功能,但是第一个使用算术比较运算符,而第二个使用字符串比较运算符。
11:if语句
if [ condition ]
then
    action
elif [ condition2 ]
then
    action2
...
else
    actionx
fi
12:for循环结构
例(1)
 #!/usr/bin/env bash
 for x in one two three four
 do
     echo number $x
 done

输出:
 number one
 number two
 number three
 number four
例(2)
 #!/usr/bin/env bash
 for myfile in /etc/r*
 do
     if [ -d "$myfile" ]
then
       echo "$myfile (dir)"
else
       echo "$myfile"
fi
 done
13:"while" 和 "until"
(1)基础知识
 shell算术,$(())
 $ echo $(( 100 / 3 ))
 33
(2)while语句
myvar=0
 while [ $myvar -ne 10 ]
 do
     echo $myvar
     myvar=$(( $myvar + 1 ))
 done
(3)until语句
myvar=0
 until [ $myvar -eq 10 ]
 do
     echo $myvar
     myvar=$(( $myvar + 1 ))
 done
14:case语句
case "${x##*.}" in
      gz)
            gzunpack ${SROOT}/${x}
            ;;
      bz2)
            bz2unpack ${SROOT}/${x}
            ;;
      *)
            echo "Archive format not recognized."
            exit
            ;;
 esac
15:全局变量与局部变量的比较,local的使用
例程1:
#!/usr/bin/env bash
 
 myvar="hello"
 
 myfunc() {
 
     myvar="one two three"
     for x in $myvar
     do
         echo $x
     done
 }
 
 myfunc
 
 echo $myvar $x
例程2:
#!/usr/bin/env bash
 
 myvar="hello"
 
 myfunc() {
     local x
     local myvar="one two three"
     for x in $myvar
     do
         echo $x
     done
 }
 
 myfunc
 
 echo $myvar $x


补充1:再一次强调:(请注意引号的使用,这是防止空格扰乱代码的好方法)
[: too many arguments   之类的错误很可能由此引起
补充2:可以将函数(如上面的函数)放在 ~/.bashrc 或 ~/.bash_profile 中,以便在 bash 中随时使用它们。
补 充3:并行 make:为了提高多处理器系统的编译速度,make 支持并行编译程序。这意味着,make 同时编译用户指定数目的源文件(以便使用多处理器系统中的额外处理器),而不是一次只编译一个源文件。通过向 make 传递 -j # 选项来启用并行 make,如下所示:
make -j4 MAKE="make -j4"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值