Shell-学习笔记

-------------------------记录了我的Shell学习笔记----------------------------

TIPS:

  1.shell文件第一行使用"#!"来表示使用什么程序来执行该脚本程序, 最好使用#!/bin/bash而不是#!/bin/sh, 当然也可以使用其他解释器

  2.亦可以不用"#!"头, 而使用sh等命令来执行, 比如sh a.sh

  3.若想使用./a.sh等形式直接执行, 1)头部需要加上用来解释本脚本的解释器 2)chmod [a|u|g|o]+x file #中括号内选一个

  4.在shell中开启一个线程执行其他语句可以使用`...`、$(...)等形式

变量:

  在Shell里, 每一个变量的值都是字符串, 无论给变量赋值的时候有没有使用引号, 值都会以字符串的形式存储.

  1.变量赋值时"="左右不许有空格

name=John

  2.需要注意shell的默认赋值是字符串赋值,

sum=1+1; 
echo $sum; 
#结果输出"1+1"

  3.算术运算, 为了达到上步想要的效果有以下几种表达方式

let "var+=1" 或者 let a++ 或者 let "var=1+1" 或者 let "var=var1+var2"
var="$[var+1]" #执行算术运算 赋值给别的变量用的 $[]将中括号内的表达式作为数学运算先计算结果再输出
((var++)) #本身赋值用的
var=$((var+1)) #执行算术运算 赋值给别的变量用的
r=`expr var1 + var2` #注意空白

 

字符串:

  可以用单引号、双引号、不用单双引号直接字符串(但有空格、分号什么的就得用引号了, 所以表示字符串最好最外加上引号), 单引号、双引号间区别为解释和不解释里面的特殊符号及变量, 比如 "!", $name等, 当双引号的时候使用echo "a{$name}"; 其中name为"John", 则输出"a{John}", 需要使用${var}形式, 在Shell里空格什么的可不能跟PHP样随意做分隔符用, 如果想输出大段字符串可以使用类似PHP中定界符形式来代替多次echo

cat <<TEXT
AAA
BBB
CCC
TEXT

 

  顺带打印字符串函数:

    echo 打印后自动换行 #echo 'abcd ${name}'

      -n: 输出时不输出结尾换行符

      -e: 使用转义序列 #echo "1\t2\t3" 会输出1制表符2制表符3

    printf 打印后不会自动换行, 与C和PHP不同的是参数间以空格隔开 #printf "My name is %10s\n" "John_ABC"

 

 if语句

if ....; then
  ....
elif ....; then
  ....
else
  ....
fi

大多数情况下, 可以使用测试命令来对条件进行测试, 比如可以比较字符串、判断文件是否存在及是否可读等等……通常用"[]"来表示条件测试, 注意这里的空格很重要, 要确保方括号前后的空格

变量判断
[ -n "$var" ] #判断$var变量是否有值
文件判断
[ -r file "somefile"] #用户可读为真
[ -w file "somefile"] #用户可写为真
[ -x file "somefile"] #用户可执行为真
[ -f file "somefile"] #文件为正规文件为真
[ -d file "somefile"] #文件为目录为真
[ -c file "somefile"] #文件为字符特殊文件为真
[ -b file "somefile"] #文件为块特殊文件为真
[ -s file "somefile"] #文件大小非0时为真
[ -t file "somefile"] #当文件描述符(默认为1)指定的设备为终端时为真


数值比较
[ $a -eq $b] #两个数值是否相等 还有ne, le, lt, ge, gt #使用此种方式足够
(( $a < $b )) #注意使用(())


字符串比较(比较字符串使用""包含字符串变量是个好习惯)
[[ -n $str ]] #判断字符串不为null
[[ -z $str ]] #判断字符串为null, 长度为0
[[ "$test"x = "test"x ]] #可以使用=, <, <=, >, >=, !=, 字符串比较可以使用"["或者"[[", 但是在"["结构中"<"等字符都需要转义, 所以推荐只使用"[["形式, 都加个x字符避免变量为空


也可以使用 test [...]等来测试

&& 和 || 操作符
[ -d "somefile" ] || { echo "Can not read $mailfolder" ; exit 1; } #类似PHP和C的短路形式 后面使用{}保持一体容易阅读


case语句
case表达式可以用来匹配一个给定的字符串, 而不是数字(可别和C语言里的switch...case混淆), 匹配可以使用通配符

case ... in
   ...) do something here
   ;; #双分号结束
   ...) do something here
   ;; #双分号结束
*) do something here #此处*匹配所有情况字符串, 即可代替C中的default
;;
esac

 

select语句

select表达式是bash的一种扩展应用, 擅长于交互式场合, 与read不同的是用户可以从一组不同的值中进行选择, 而不是让用户输入

select var in ... ; do #注意此分号
 break; #注意此break, 如果没有break将会一直循环下去
done
.... now $var can be used ....

下面是一个简单的示例

#!/bin/bash

echo "What is your favourite OS?"
select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do
     break;
done
echo "You have selected $var"

可以配合select与case使用

#!/bin/bash
echo 'What is your name?'
select var in 'John' 'Nali'; do
    case $var in
        'John') echo 'His name is John';;
        'Nali') echo 'Her name is Nali';;
        *) echo 'No ever';;
    esac
    break; #注意此break, 如果没有break将会一直循环下去 
done

 

while语句

while ...; do
   ....(break|continue)
done

 

for语句

for var in ....; do #可以使用{1..10}, {a..z}, '1' '2', `seq 1 100`等形式做为数组
   ....
done

 

引号

引号可以忽略通配符的扩展, 比如现目录下有abc.jpg, bcd.jpg 执行以下命令会列出此两个文件abc.jpb bcd.jpg

ls *.jpg

如果使用以下命令则只会列出'*.jpg'(如果有的话)

ls '*.jpg' #或者 "*.jpg"

也可以使用转义符来忽略

ls \*.jpg

here

posted on 2013-08-09 16:07  John_ABC  阅读(301)  评论(0编辑  收藏  举报

导航