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"
$ 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"