`
jolestar
  • 浏览: 195124 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Shell(Bash)学习笔记(一)

阅读更多

以前只是简单看过一些文章,了解一些。平时也就是写个简单的命令组合啥的,没写过复杂的脚本。最近一次为了恢复数据,写了一下脚本,发现这东西光学不练确实不行。顺便记一下学习笔记备用。

约定:本文中的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官方参考手册

7
1
分享到:
评论

相关推荐

    Bash shell 学习笔记

    Bash shell 学习笔记

    PDF电子书《Bash Shell学习笔记》

    PDF电子书《Bash Shell学习笔记》,和大家分享~~

    Bash_shell学习笔记

    Bash_shell学习笔记

    shell编程学习笔记

    shell脚本成分 开头和注释: shell脚本的开头,用来解释shell程序,包括:#!/bin/bash、#!/bin/csh、#!/bin/tcsh、#!/bin/pdksh,一般用#!/bin/bash。。 shell脚本中的注释,以#开头的...

    bash shell学习笔记

    一、创建shell脚本、重定向输入与输出、执行数学运算、退出脚本 二、shell脚本中的各种结构化命令的格式与用法(for、while、until、break等) 三、处理用户的输入:命令行参数、特殊参数变量、移动变量、获取用户...

    入门到熟练 高效 Bash Shell 学习笔记材料书籍 BashNotesForProfessionals

    一本特别实在的 Bash 笔记教程,学习效率很高。是一份不可多得的高效 Bash 学习材料。如果你想学习 Bash Shell、Bash 脚本编程,看它绝对没错。免费分享!不用积分,更不用付费! 或者从此处直接下载: ...

    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脚本学习笔记–基础(1)

    shell脚本学习笔记–基础(1)简介脚本注释脚本解释器脚本执行脚本调试基本符号和命令含义 简介 学习Shell脚本之前,我们有必要先来认识认识什么叫Shell?谈到这个问题,我们首先来回忆一下计算机自底向上的体系,最...

    Linux shell 编程学习笔记

    这次难得有时间和条件来学习,所以做好笔记。 一:shell 能做什么  二:shell 脚本的几种执行方式,我们创建文件 start.sh,并且赋予 执行权限 chomd +x start.sh #然后可以通过以下命令执行 #相对路径,或者绝对...

    bash-study:shell学习笔记

    BASH STUDY这个项目目的在于学习 bash.#说明由于初学shell,所以进程管理和系统级shell 没有记录。#历史2014.3,读了 《学习 bash》第二版。2014.3.14,建立目录框架2014.3.28,增加了 awk,windows bat, python 脚本。...

    shell自研基础学习笔记

    内容包含shell基础所有内容,适合于新手学习,内容非常全面,值得拥有

    BASH 学习笔记小结

    要使脚本可执行: 编译 chmod +x filename 这样才能用./filename 来运行 1.1.2 注释 在进行shell编程时,以#开头的句子表示注释,直到这一行的结束。我们真诚地建议您在程序中使用注释。如果您使用了注释,那么即使...

    SHELL笔记.doc

    本文档是SHELL学习文档,个人笔记,简单便捷,精准学习,可以当做参考书

    bash获取当前路径示例

    您可能感兴趣的文章:bash shell命令行选项与修传入参数处理Bash Shell 注释多行的几种方法bash批量修改文件名称的方法小结(增加,去除,修改后缀)bash 编程中循环语句用法BASH 学习笔记小结Bash Shell字符串操作小...

    2009 达内Unix学习笔记

    ksh:$ sh:$ csh:guangzhou% bash:bash-3.00$ 一、注意事项 命令和参数之间必需用空格隔开,参数和参数之间也必需用空格隔开。 一行不能超过256个字符;大小写有区分。 二、特殊字符含义 文件名以“.”开头...

    shell学习笔记

    echo echo [选项] [输出内容] 选项: -e: 支持反斜线控制的字符转换 \\ 输出\本身 \a 输出警告音 \b 退格键,也就是向左删除键 ...shell脚本开头 脚本的执行 1 首先要赋予脚本x权限,输入脚本的绝对路径

    bash_learning:学习Linux的笔记

    bash_learning:学习Linux的笔记

    linux学习笔记(3)

    2、创建shell脚本文件hello.sh:脚本第一行写上#!bin/bash 例: #!bin/bash echo -e \e[1;32m 第一个脚本文件\e[0m 3、脚本运行: 赋予执行权限,直接运行 chmod 755 hello.sh ./hello.sh# 或通过bash调用执行脚本...

    shell脚本返回值问题的解决

    如果学习过高级语言比如java和c语言等,此时你要是获取一个函数的返回值,直接在函数里面写上return即可,然后在函数执行时将返回结果赋值给某个变量即可。但是在shell脚本中限制较多,因此如果我们想实现这样的功能...

    my-linux-config:为了创建一个有效的开发人员环境,它是一本运行手册,在安装Linux后可以自定义bash&zsh,nano和各种工具。 安装所需的开发工具

    hands: 它是如何创建的学习,练习和签到行之有效的方法在开发人员生产力的背景下,了解Linux的深度,shell,各种开发工具功能捕捉“启动和运行”,“提示和技巧”以及学习笔记 :rocket: 何时使用管理针对bash,zsh,...

Global site tag (gtag.js) - Google Analytics