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
bash编程指南 前言 本文译自《Slackware Linux Unleashed》(第三版)一书的 bash 一章,但做了一些 必要的删节,并且有的地方根据实际情况作了较大的改动,必要的话请参考原文。对本文有 任何问题的话请与我联系:...
资源名称:Linux Bash编程与脚本应用实战资源截图: 资源太大,传百度网盘了,链接在附件中,有需要的同学自取。
### 高级Bash编程知识点概述 #### 一、引言 本教程旨在为初学者提供一条通往高级Bash编程的道路。它不仅适用于自学,也是课堂教学的理想材料,尤其是在教授编程概念方面。通过丰富的实例和练习,读者将逐步掌握...
《高级BASH编程指南》:精通Unix/Linux下的Shell编程 标题:高级BASH编程指南 描述:Unix/Linux下的Shell编程指南 核心知识点概览: 1. **BASH的地位与重要性**:Bash(Bourne Again Shell)是Unix/Linux环境中最...
毫无疑问,UNIX/Linux 最重要的软件之一就是shell,目前最流行的shell 被称为Bash(Bourne Again Shell),几乎所有的Linux 和绝大部分的UNIX 都可以使用Bash。作为系统与用户之间的交互接口,shell 几乎是你在UNIX ...
在Linux开发中,Bash编程是一个基础但非常重要的技能。Shell脚本广泛应用于系统管理、安装、任务调度、网络管理等方面。由于Shell脚本能够将常用的命令序列整合到一个文件中,用户只需运行一个脚本文件即可完成一...
### bash编程实例:基础知识与应用场景 #### 一、Shell与Bash简介 Shell是一种命令解释器,也是操作系统内核与用户之间的桥梁。它不仅能够解释并执行用户输入的命令,而且还是一种强大的编程语言。通过创建一系列...
【Bash编程1】概述 Bash编程,也被称为Shell脚本编程,是Linux和Unix系统中常用的一种自动化任务执行方式。它利用Bourne-Again SHell (Bash) —— Linux默认的Shell,来编写一系列可执行的命令,形成一个可执行文件...
《高级Bash编程指南》是一本深入探讨Shell脚本编程艺术的专业书籍,由Mendel Cooper撰写,旨在帮助读者从初学者进阶为Bash编程的高手。这本书以丰富的实例和详尽的解释,覆盖了Bash编程的各个方面,不仅适合初学者,...
**高级Bash编程指南中文版**是一本深入探讨Bash shell脚本编程的资源,源自英文版的**Advanced Bash Programming Guide**。Bash是Linux和类Unix系统中最常用的命令行解释器,也是编写自动化任务和脚本的强大工具。这...
《高级Bash编程指南》是一本专为熟练和有经验的Linux或Unix用户设计的书籍,旨在深入探讨Bash shell的高级用法和编程技巧。Bash,全称Bourne-Again SHell,是GNU项目的一个核心组件,广泛应用于各种Linux发行版和类...
首先,我们来了解Bash编程的基础。Bash脚本通常以`#!/bin/bash`作为开头,声明使用Bash解释器执行该文件。脚本中的每一行都是一个命令,可以是内置命令、shell函数、外部程序,或者通过分号或换行符隔开的多个命令。...
**Linux高级Bash编程(ABS)** Bash(Bourne-Again SHell)是Linux系统中最常用的命令行解释器,也是系统脚本编写的重要工具。深入理解和掌握Bash编程,能够极大地提升Linux系统的使用效率和自动化处理能力。在本文...
**精通Bash编程** Bash(Bourne-Again SHell)是Unix和类Unix操作系统中最常用的一种命令行解释器,也是Linux系统默认的shell。它由GNU项目开发,是自由软件,广泛应用于各种Linux发行版及macOS。这本书《精通Bash...
**高级Bash编程指南**是针对Linux或Unix系统中Bash shell脚本编写的一份深入教程,这份PDF版教程旨在帮助用户充分利用Bash的强大功能,提高自动化任务处理和系统管理的效率。Bash(Bourne-Again SHell)是大多数...
### bash编程方法详解 #### 一、Bash编程概述 **Bash**(Bourne Again SHell)是一种广泛使用的Unix shell,它不仅适用于日常的命令行操作,而且还能用来编写功能强大的脚本程序。在Linux环境中,Bash是默认的交互式...