bash编程

Unix系统中,进程对内存的使用是区块化的.每个进程在运行过程中读取数据都必须在其自身定义的内存区块内进行.不能越界存取.
因此,无论何时定义一个新的变量,它都会存储在与本进程相联系的局部数据空间中,如果其他进程想要存取这个变量.这个变量必须被传递到全局变量中(使用export),一旦某个变量存在于全局环境中,它将对后来的进程都有效,即全局变量对每个进程都有效.


进程间传递数据的唯一方法就是通过环境变量进行传递.

当执行一个shell脚本时,一个子shell会被创建.这个子shell会从shell脚本里来读取输入而不是从命令行读取输入
这个脚本里每个命令的执行都会创建一个子shell.一旦所有的命令都被执行.所有的子shell会中止,然后返回原始的父shell.


$# 命令行位置参数的个数
$* 表示完全的参数字数符
$? 前一个命令返回的状态值
$$ 当前shell的PID值.
$! 最近访问的后台进程PID值


shell也有一个真正的调试模式,如果脚本"strangescript"出错,可以使用如下命令进行调试:
sh -x strangescript 
shell还有一个不执行脚本只检查语法的模式,命令如下:
sh -n your_script


#!/bin/bash
 x=1999
 let "x = $x + 1"
整数运算一般通过let和expr命令来实现,对变量可以写: let "x=$x+1" 或 x=expr $x+1
整数操作 字符操作
相同 -eq =
  不同 -ne !=
  大于 -gt >
  小于 -lt <
 大于或等于 -ge
 小于或等于 -le
字符为空 -z
字符不为空 -n

比较字符串 a 和 b 是否相等就写作:if [ $a = $b ]

  判断字符串 a 是否为空就写作: if [ -z $a ]

  判断整数变量 a 是否大于 b 就写作:if [ $a -gt $b ]

bash对文件的操作
if [ -x /root ] 可以用于判断 /root 目录是否可以被当前用户进入。

  运算符 含义( 满足下面要求时返回 TRUE )
  -e file 文件 file 已经存在
  -f file 文件 file 是普通文件
  -s file 文件 file 大小不为零
  -d file 文件 file 是一个目录
  -r file 文件 file 对当前用户可以读取
  -w file 文件 file 对当前用户可以写入
  -x file 文件 file 对当前用户可以执行
  -g file 文件 file 的 GID 标志被设置
  -u file 文件 file 的 UID 标志被设置
  -O file 文件 file 是属于当前用户的
  -G file 文件 file 的组 ID 和当前用户相同
  file1 -nt file2 文件 file1 比 file2 更新
  file1 -ot file2 文件 file1 比 file2 更老

[ -f "$file" ] 判断$file是否是一个文件
[ $a -lt 3 ] 判断$a的值是否小于3,同样-gt和-le分别表示大于或小于等于
[ -x "$file" ] 判断$file是否存在且有可执行权限,同样-r测试文件可读性
[ -n "$a" ] 判断变量$a是否有值,测试空串用-z
[ "$a" = "$b" ] 判断$a和$b的取值是否相等
[ cond1 -a cond2 ] 判断cond1和cond2是否同时成立,-o表示cond1和cond2有一成立
要注意条件测试部分中的空格。在方括号的两侧都有空格,在-f、-lt、=等符号两侧同样也有空格。如果没有这些空格,Shell解释脚本的时候就会出错。

$#表示包括$0在内的命令行参数的个数
$*表示整个参数列表,不包括$0,也就是说不包括文件名的参数列表。

制作帮助文档
----------------------------
cat << HELP



HELP
exit 0
---------------------------
将上面的帮助文档做成一个help函数。
[ -z "$1" ] && help 第一个参数为空则显示help函数
[ "$1" = "-h" ] && help 第一个参数为-h则显示help函数


if 循环语句
#!/bin/bash
#test the usege of bash control file

if [ -x /home/collins ]
then
echo "I have entered in collins directory"
if [ -e /home/collins/log ]
then
echo "helloworld file exits"
fi
fi
注意 if 语句与【之间一定要有空格 后面 】的前面也要有空格。
如果将 if 和 then写在一行里面,就必须在 then 前面加上分号,如:if [ expression ]; then

for 循环语句
#!/bin/bash
  for day in 1 2 3 4 5 6
  do
  echo $day
  done

如果列表被包含在一对双引号中,则被认为是一个元素 "1 2 3 4 5 6" 则结果为 1 2 3 4 5 6

case 语句
#!/bin/bash
  echo "Hit a key, then hit return."
  read Keypress
  case "$Keypress" in
  [a-z] ) echo "Lowercase letter";;
  [A-Z] ) echo "Uppercase letter";;
  [0-9] ) echo "Digit";;
  * ) echo "Punctuation, whitespace, or other";;
  esac
  exit 0

break 语句可以让程序流程从当前循环体中完全跳出,而 continue 语句可以跳过当次循环的剩余部分并直接进入下一次循环。


局部变量
若想定义一个局部变量,则可以在赋初值时在变量前加上一个local关键字。
#!/bin/bash
 HELLO=Hello
 function hello { //注意hello 后面一定要留个空格,及函数名称和函数体之间要有空格。
 local HELLO=World
 echo $HELLO
  }
 echo $HELLO
 hello

BASH 中的变量与 C 语言中变量的区别
  这里我们为原来不熟悉 BASH 编程,但是非常熟悉 C 语言的程序员总结一下在 BASH 环境中使用变量需要注意的问题。
  1,BASH 中的变量在引用时都需要在变量前加上 "$" 符号( 第一次赋值及在For循环的头部不用加 "$"符号 );
  2,BASH 中没有浮点运算,因此也就没有浮点类型的变量可用;
  3,BASH 中的整形变量的比较符号与 C 语言中完全不同,而且整形变量的算术运算也需要经过 let 或 expr 语句来处理;
输入,输出和错误输出
标准输入(stdin) 标准输出(stdout) 标准错误输出(stderr) 一般将标准输出表示为1,错误输出表示为2,

如果直接执行 find /home -name lost* > all_result ,其结果是只有标准输出被存入 all_result 文件中

$ find /home -name lost* > all_result 2>& 1

上面这个例子中将首先将标准错误输出也重定向到标准输出中,再将标准输出重定向到 all_result 这个文件中。这样我们就可以将所有的输出都存储到文件中了。


函数的返回值在调用该函数的程序体中通过 $? 保留字来获得。
BASH 的返回值可以用return语句来指定返回一个特定的整数,如果没有 return 语句显式的返回一个返回值,则返回值就是该函数最后一条语句执行的结果(一般为 0,如果执行失败返回错误码)

select 语句可以让用户从一组数据中进行选择。
#!/bin/bash
echo "Your choice?"
select var in "a" "b" "c"; do
break
done
echo "Your choice is $var"
-------------------------------------------
运行结果是
Your choice?
1) a
2) b
3) c
输入2 然后显示 Your choice is b

bash也提供了真正的调试方法,在执行程序时加上 ?x 参数。
sh ?x filename.sh


-----------------------------------------
一个脚本
#!/bin/sh
# vim: set sw=4 ts=4 et:

ver="0.1"
help()
{
cat << HELP
rotatefile -- rotate the file name
USAGE: rotatefile [-h] filename
OPTIONS: -h help text
EXAMPLE: rotatefile out

This will e.g rename out.2 to out.3, out.1 to out.2, out to out.1[BR]
and create an empty out-file

The max number is 10

version $ver
HELP

exit 0
}

error()
{
echo "$1"
exit 1
}

while [ -n "$1" ]; do
case $1 in
-h) help;shift 1;;
--) break;;
-*) echo "error: no such option $1. -h for help";exit 1;;
*) break;;
esac
done

# input check:
if [ -z "$1" ] ; then
error "ERROR: you must specify a file, use -h for help"
fi

filen="$1"
# rename any .1 , .2 etc file:
for n in 9 8 7 6 5 4 3 2 1; do
if [ -f "$filen.$n" ]; then
p=`expr $n + 1`
echo "mv $filen.$n $filen.$p"
mv $filen.$n $filen.$p
fi
done

# rename the original file:
if [ -f "$filen" ]; then
echo "mv $filen $filen.1"
mv $filen $filen.1
fi

echo touch $filen
touch $filen
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值