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
分享到:
相关推荐
Bash编程.pdf
资源名称:Linux Bash编程与脚本应用实战资源截图: 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
bash编程指南 前言 本文译自《Slackware Linux Unleashed》(第三版)一书的 bash 一章,但做了一些 必要的删节,并且有的地方根据实际情况作了较大的改动,必要的话请参考原文。对本文有 任何问题的话请与我联系:...
高级Bash编程
bash 编程bash 编程bash 编程bash 编程bash 编程bash 编程bash 编程bash 编程bash 编程bash 编程
毫无疑问,UNIX/Linux 最重要的软件之一就是shell,目前最流行的shell 被称为Bash(Bourne Again Shell),几乎所有的Linux 和绝大部分的UNIX 都可以使用Bash。作为系统与用户之间的交互接口,shell 几乎是你在UNIX ...
bash编程实例,初学者很好的教材
高级bash编程的一本好书,适合linux编程脚本学习,书中讲的很详细
linux abs和bash编程 linux abs和bash编程 linux abs和bash编程
高级Bash编程指南 - Advanced Bash-Scripting Guide Bash编程的精典书籍,太精典了,看完你肯定是Bash高手!
在linux下进行bash编程来维护系统 是linux运维手册 shell编程
高级bash编程指南中文版,原版为(Advanced bash programming guide)
高级bash编程 高级Bash脚本编程指南(一) 目录 ++++ 第一部分. 热身 1. 为什么使用shell编程 2. 带着一个Sha-Bang出发(Sha-Bang指的是#!) 2.1. 调用一个脚本 2.2. 初步的练习 第二部分. 基本 3. 特殊...
2009年图书:精通Bash编程 Bash编程 高清晰pdf 原版图书 英文原版 linux
高级bash编程指南_PDF版.zip
bash编程首选必看文档,linux shell开发及脚本编写首选,网管人员必看
[精华] bash 编程
bash编程技巧及多数的编程语句规范,适合初学者学习查看
自网上下载的有关Bash编程的教程,虽然老了点,贵在实用
高级linux bash shell 编程! 高级linux bash shell 编程! 高级linux bash shell 编程! 高级linux bash shell 编程! 高级linux bash shell 编程! 高级linux bash shell 编程! 高级linux bash shell 编程!