以前只是简单看过一些文章,了解一些。平时也就是写个简单的命令组合啥的,没写过复杂的脚本。最近一次为了恢复数据,写了一下脚本,发现这东西光学不练确实不行。顺便记一下学习笔记备用。
约定:本文中的shell特指bash.
由于javaeye博客编辑器没有提供shell代码格式,就只好勉强用javascript脚本格式插入代码。
一.变量
变量直接赋值,不用提前声明。
var="Hello"
var=Hello
var='Hello'
注意几点:
1.变量和值之间不能有空格,否则解释器会认为是几个命令。很多程序员的习惯是在=号两边留空格为了好看,但这点在shell中行不通。
2.字符串不必用"号或者',上面的几种赋值方式是等价的。除非字符串之间有空格的时候。
如:
var="Hello World"
这时候就需要用引号。
3.
var=
这样的语句也是合法的,表示var的值为空。
4.使用变量的时候需要在变量前面加上$符号。这一点php程序员比较熟悉。
如:
echo $var
这也就是为什么shell中的字符串不必用引号的原因。你如果直接运行
echo var
系统会将var当作字符串,而不是变量处理。在变量前加上$号还有个好处就是在字符串中输出变量的时候,直接在字符串里面用变量就行。
如:
var=World
var2="$var World"
echo $var2
但与php不同的是变量赋值的时候不用加$符号。因为shell中没有==这个符号,判断相等也是用=号。如果赋值的时候加上$号,会产生混淆。
还有一点要注意的就是单引号(')字符串 中的变量不会被替换。
var=World
var2='$var World'
echo $var2
上面的语句输出结果:$var World
这个可以用来输出$等特殊符号,而不用担心字符被当作变量替换。
二.语句
1.shell的语句不必用;号结束,除非是同一行写几个语句的时候。
2.shell中的语句块不用{}号扩起来。if语句一般就用fi表示结束。当然这个也有特例,后面会提到。
3.if语句
if [ condition ]
then
action
elif [ condition2 ]
then
action2
.
.
.
elif [ condition3 ]
then
else
actionx
fi
需要注意的是shell中没有elseif,而是elif(这个缩写也太变态了吧,有必要么?).
每个或者elif后跟着then,并且要换行或者用;分开。then可以和后面的action在一行。
3.for循环
var="one two three four"
for x in $var
do
echo $x
done
for循环用do 和 done表示开始结束,不要举一反三,认为是用 rof结束。
4.while和util循环
while [ condition ]
do
statements
done
until [ condition ]
do
statements
done
5.条件语句
shell中的条件语句用[]号括起来,用于if,while,until等结构。
条件判断用=号,而不是==号。条件语句与[] 号之间要有空格分开。
如:
gender="boy"
if [ "$gender" = "girl" ]
then
echo 'Welcome!'
else
echo 'We only welcome girl.'
fi
还有要注意的是条件语句中=号两旁要有空格分开,否则shell会将条件语句整个作为一个字符串处理,条件永远为真。条件语句中的变量最好用"号引起来,否则如果该变量中有空格,shell就会报too many arguments错误。如果变量正好为空,则会报 =: unary
operator expected.错误。因为变量为空的话,条件语句少了一边,当然会出错。所以,将字符串变量用双引号括起来是shell编程的好习惯,尤其在条件语句中。
其他的比较符号,如 >,<,不能直接在条件语句中使用,因为>号在shell中有特殊含义。下面是shell的比较运算符号表示方法:
算术比较运算符
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 ]
字符串比较运算符
-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" ]
6.case 语句
gender="boy"
case "$gender" in
boy)
echo "We only welcome girl."
;;
girl)
echo 'Welcome !'
;;
*)
echo "unknow."
;;
esac
case语句的语法比较怪,乍一看比较别扭。每个pattern用 半括号括起来,用;;结束。
三.算术
shell 默认是用来处理字符串的,所以如果你直接运行:
echo 1+1
它会直接输出1+1,而不会输出2。 如果需要计算表达式的值,则只需用"$((" 和 "))"将表达式
括起。
echo $((1+1))
四.函数
add(){
result=0
for n in $*
do
result=$(($result+$n))
done
return $result
}
执行:
add 1 2 3
echo $?
echo $result
两个输出结果都是:6.
这里需要几点说明.shell中是不能直接获得函数的返回值的,如果你要用函数返回值,只能用全局变量传输。shell中的变量默认都是全局的,除非你在前面加了local修饰符。如上面的例子,在函数外面,result变量也是可见的。如果你在result前加local修饰,result变量在函数外就不可见了。但shell会把函数返回值放在$?全局变量中,你可以用$? 来取得前个函数调用的返回值。$*可以获得函数的所有输入参数,$1表示第一个参数,以此类推。
五.其他
shell内置的一些特征,可以很容易的处理文件,以及和其他程序交互。
文件比较运算符
-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 ]
for 循环中很容易遍历文件
for file in /home/*
do
if [ -d "$file" ]
then
echo $file is a directory
fi
done
很容易调用其他程序的输出结果:
for user in `awk -F":" '{ print $1 }' /etc/passwd`
do
echo find user $user
done
shell脚步中要使用其他命令的输出结果,只需用`符号把命令包含起来。注意:这个符号不是单引号,在键盘左上角那个位置。
六. 后记
基本的shell语法就学了这些,高级的还没弄通。这篇笔记也差不多长了,别的再边学边写。shell是基础,要配合awk,grep,sed这些工具才能发挥出效果。最近在看《unix编程艺术》,上面谈到了*nix系统的几个哲学基础原则,其中有个原则就是:
组合原则:设计时考虑拼接组合
*nix系统程序的的输入和输出一般都是简单,文本化,面向流的格式。这样便于程序和程序之间的交互和拼接。*nix系统下的程序一般都只完成单一功能,如果你需要要一个复杂的功能,那就需要把小程序拼接在一起。这一特征也决定了shell在*uix系统中的重要性。
七.shell学习资料
1.IBM Shell编程系列
本文中的许多例子以及资料就是来自该系列教程
2.Bash 参考手册
Gnu的bash官方参考手册
分享到:
相关推荐
### Bash Shell 学习笔记知识点概览 #### 1. 引言 - **Shell**:作为用户与操作系统之间的桥梁,Shell提供了一种与系统进行交互的方式,支持用户执行命令和编写脚本来自动化任务。 - **Bash**:是Bourne-Again ...
根据给定的"Bash shell学习笔记"文件信息,我们可以从中提炼出多个重要的IT知识点,具体如下: ### 1. 引言 - **Shell的角色**:Shell作为一个命令解释器和编程语言,在用户与UNIX/Linux系统内核之间提供了一个桥梁...
shell脚本成分 开头和注释: shell脚本的开头,用来解释shell程序,包括:#!/bin/bash、#!/bin/csh、#!/bin/tcsh、#!/bin/pdksh,一般用#!/bin/bash。。 shell脚本中的注释,以#开头的...
bash学习笔记:Bash_是_Unix_系统和_Linux_系统的一种_Shell(命令行环境),_Bourne-Again-SHell
一、创建shell脚本、重定向输入与输出、执行数学运算、退出脚本 二、shell脚本中的各种结构化命令的格式与用法(for、while、until、break等) 三、处理用户的输入:命令行参数、特殊参数变量、移动变量、获取用户...
一本特别实在的 Bash 笔记教程,学习效率很高。是一份不可多得的高效 Bash 学习材料。如果你想学习 Bash Shell、Bash 脚本编程,看它绝对没错。免费分享!不用积分,更不用付费! 或者从此处直接下载: ...
这个个人学习笔记集合了作者在深入理解Linux Shell过程中的经验与精华,旨在帮助读者更好地掌握这一强大的命令行工具。 首先,让我们了解一下Shell的基础知识。在Linux中,Shell是一个命令解释器,它接收用户的输入...
bash_shell的学习笔记,常用又难用的一些linux命令的总结,比如find。_ShellLearning
shell脚本编程学习笔记汇总 本文档总结了 Linux shell 脚本编程的学习笔记,涵盖了 shell 脚本的定义、编写、权限、存放位置、函数、变量、IF 控制语句、命令退出状态等知识点。 一、shell脚本的定义 shell 脚本是...
第1章 BashShell命令 6 1.1 Shell提示符 6 1.2 文件与目录Shell命令 7 1.2.1 更改目录命令(cd) 7 1.2.2 列表命令(ls) 7 1.2.3 操作文件命令 10 1.2.4 目录处理命令 14 1.2.5 查看文件内容命令 15 1.3 监控程序 20 ...
Shell是一种广泛用于Unix和类Unix系统中的命令行解释器,也称为命令语言,...总的来说,《Shell学习笔记》是一份详尽的Shell脚本学习材料,它覆盖了从基础到高级的多个方面,适合初学者和有一定经验的用户学习和参考。
### Shell Script 编程学习笔记 #### 一、Shell 脚本初窥 ##### 示例: ```bash #!/bin/sh # 第1行:指定脚本解释器(声明使用的shell名称),这里是用/bin/sh做解释器的。“#!”是一个约定的标记 cd ~ # 第2行:...
**Bash Shell 小笔记** Bash Shell是Unix/Linux操作系统中最常用的一种命令行解释器,全称为Bourne-Again SHell,它是GNU项目的一部分,是Linux系统默认的Shell环境。Bash Shell提供了丰富的命令行交互功能,允许...
【Shell入门学习笔记】 Shell是Linux/Unix操作系统中的一种命令解释器,它为用户提供了与操作系统交互的界面。本文档主要介绍了Shell脚本的基础知识,适用于初学者。 ### 1. Shell脚本基础 1.1 脚本结构 在Shell...
Shell 学习笔记总结 本资源是 Shell 学习笔记的总结,涵盖了 Shell 的基本概念、类型、变量、进程、权限、管道、POSIX、grep、sed、awk 等命令和编程语言。 一、 Shell 的类型和特点 Shell 是一种命令行界面,...
Linux是开源的操作系统,它的命令行界面,尤其是Shell编程...因此,无论你是技术小白还是希望进一步提升,这份“Linux零基础学习笔记 Shell编程-菜鸟入门”都会是你宝贵的资源。祝你在学习的道路上越走越远,不断进步!