http://www.cnblogs.com/nfcm/p/7743418.html
https://www.cnblogs.com/zhang-jun-jie/p/9266858.html

  1. 建立.sh文件 vim a.sh
  2. 执行.sh文件 sh filename
  3. chmod +x test.sh

默认我们用vim编辑的文档是不带有执行权限的,所以需要加一个执行权限,那样就可以直接使用’./filename’ 执行这个脚本了
chmod +x a.sh
./a.sh

更改权限
查看文件权限的命令,比如我查看/data目录下的文件权限命令:

  1. ls -al : 查询当前目录下所有文件的权限

  2. 如果目录下的所有文件都需要以管理员的方式进行文件的复制,创建,和移动。

比如我的data目录 ,此时只需要: $ sudo chmod 777 /data1

  1. chmod [who][+|-|=][mode] 文件[夹]名

其中who可以为下面字母中的任意一个或者它们的组合。
u 即user,表示文件[夹]的所有者
g 即group,与文件[夹]所有者处于相同组的所有用户
o 即others,其它用户
a 即all,所有用户
+、-、=符号的含义分别为:
添加某个权限
取消某个权限
= 赋予给定权限并取消其它所有权限
mode表示权限,可以是下面字母的任意组合。
r 可读
w 可写
x 可执行
s 文件执行时将进程所属用户(u+s)或进程所属组(g+s)设置为该文件所属用户
t 保存程序的文本到交换设备上
u 与文件主拥有相同的权限
g 与文件所属组拥有相同的权限
o 与其他用户拥有相同的权限
**

一、输出

  1. #! /bin/sh
  2. #定义变量
  3. name=张三
  4. echo $name
  5. echo "参数:$*"
  6. echo "参数个数$#"

第一行:一般默认第一行都是上面这段#! /bin/sh,
通知系统用/bin/sh来执行下面的程序。

以“#”开头的行代表注释

echo代表输出后面一段话的到用户界面
$name 代表使用了name这个变量(定义shell变量在下面介绍)
$* 代表所有的参数
$# 代表参数的个数
$? 代表上一个命令的返回值
$数字: 代表第几个参数
**$$ Shell本身的PID(ProcessID)
$! Shell最后运行的后台Process的PID
$? 最后运行的命令的结束代码(返回值)
$- 使用Set命令设定的Flag一览
$ 所有参数列表。如”$“用「”」括起来的情况、以”$1 $2 … $n”的形式输出所有参数。
$@ 所有参数列表。如”$@”用「”」括起来的情况、以”$1” “$2” … “$n” 的形式输出所有参数。
$# 添加到Shell的参数个数
$0 Shell本身的文件名
$1~$n 代表第几个变量

二、输入数据并读取

除了带参数的方式我们还可以使用read进行读

  1. #! /bin/sh
  2. echo "please enter a"
  3. read a
  4. echo "please enter b"
  5. read b
  6. echo "a=$a,b=$b"

如果read命令后有变量名,输入内容赋给该变量。
如果read命令后未跟变量名,读入的行将被赋值给内置变量REPLY。

三、if判断

**(一)判断条件是否正确test是一个固定关键字,用来判断condition的描述是否正确

  1. #! /bin/sh
  2. if (test "start" = "${1}" ) then
  3. echo "start"
  4. else
  5. echo "end"
  6. fi

(二)判断文件或者文件夹是否存在
option:

-d 文件存在且是目录
-e 文件存在
-r 文件存在且可读
-w 文件存在且可写
-x 文件存在且可执行
  1. #! /bin/sh
  2. if [ -d "${1}" ]; then
  3. echo exist
  4. else
  5. echo notexist
  6. fi
  7. #格式:
  8. #if [ -option file]; then
  9. # commands
  10. #else
  11. # commands
  12. #fi

四、循环

1. While

while[ expr ]: ([右边和]左边都要有一个空格)

  1. #! /bin/sh
  2. tmp=0
  3. while [ "$tmp" != "5" ];
  4. do
  5. echo "curtmp=$tmp"
  6. tmp=$[ $tmp + 1 ]
  7. done

2. for

  1. #! /bin/sh
  2. for name in $*; #name是变量名
  3. do
  4. echo "$name"
  5. done

3. case

eg: 如果有一个pattern匹配到跟string内容一样,执行这里面的内容,否则执行最下面的分支,
*;;两个分号代表退出case循环,跟C语言的break

  1. case "string" in
  2. pattern_1)
  3. commands
  4. ;;
  5. pattern_2
  6. commands
  7. ;;
  8. *)
  9. commands
  10. ;;
  11. esac


五、Shell命令

如果我们想在shell中执行一段命令,并将该命令的值存放到一个变量中,
就要用到 符号(在1数字旁边)

  1. #! /bin/sh
  2. result=`ls`
  3. echo result=$result

六、函数

eg:

  1. #! /bin/sh
  2. function fun1
  3. {
  4. echo "第一个参数:$1"
  5. echo "第二个参数: $2"
  6. return 100
  7. }
  8. fun1 3 4
  9. echo "函数返回值:$?"

七、练习

  1. #! /bin/bash
  2. #编写shell脚本,批量建立用户user_00, user_01, … ,user_100并且所有用户同属于users组;
  3. groupadd users
  4. for i in `seq 0 9`;
  5. do
  6. useradd -g users user_0$i
  7. done
  8. for j in `seq 10 100`;
  9. do
  10. useradd -g users user_$j
  11. done
  1. #! /bin/bash
  2. # 编写shell脚本,把/root/目录下的所有目录(只需要一级)拷贝到/tmp/目录下
  3. for f in `ls /root/`;
  4. do
  5. if [ -d $f ] ; then
  6. cp -r $f /tmp/
  7. fi
  8. done


  1. #! /bin/bash
  2. # 编写shell脚本,要求输入一个数字,然后计算出从1到输入数字的和,
  3. # 要求,如果输入的数字小于1,则重新输入,直到输入正确的数字为止;
  4. n=0
  5. while [ $n -lt "1" ]; do
  6. read -p "Please input a number, it must greater than "1":" n
  7. done
  8. sum=0
  9. for i in `seq 1 $n`; do
  10. sum=$[$i+$sum]
  11. done
  12. echo $sum