初识shell

1、创建shell脚本文件

vim test.sh

2、shell脚本第一行

第一行需要写:#!/bin/bash

这一行( #!/bin/bash )其实并不是必不可少的,但是它可以保证此脚本会被我们指定的 Shell 执行。


3、给脚本文件添加可执行权限

查看权限:ls -l

添加可执行权限:chmod +x test.sh 


4、shell语法

1、变量  aa="ceshi"  等号两遍一定不要加空格

2、echo显示内容

echo "hello world"

echo "hello $aa"  输出变量,切记不能用单引号,如果是单引号输出为 hello $aa

echo $aa  直接输出变量

3、read请求输入

1、read name

    echo "姓名:$name"

2、带有输入提示的

read -p "请输入姓名:" name   

echo "姓名:$name"

  3、-n 限制字数

read -p "请输入姓名:" -n 10 name    限制10字节,超过会立即显示输出内容

  4、-t显示输入时间

read -p "请输入姓名:" -t 30 name    限制30秒内输入,超时立即显示输出

  5、-s隐藏输入内容

read -p "请输入密码:" -s password

4、数学运算

1、整数运算

let  "a = 1"

let "b = 2"

let "c = a + b"

echo "c=$c"

2、小数计算bc

echo "scale=3;12.3/3"|bc

scale=3;保留三位小数

5、参数变量

$# :包含参数的数目

$0 :被运行的脚本的名称

$1 :第一个参数

$2:第二个参数.....


shift:移动参数

echo "这是第一个参数:$1"

shift

echo "这是新的第一个参数:$1"    此时的$1的值为第二个参数的值,依次往后推

6、数组

arr=('111' '222' '333' '444')    每一项中间用空格分隔,下标同样从0开始

arr[6]='666'

echo "数组第二项是:${arr[1]}"

echo ${arr[*]}  会输出数组的所有项

7、判断

1、if语句判断语句后面需要加;与then分隔,并且以fi结束,[]中间需要加空格

read -p "请输入姓名:" name

if [ $name = "qwer" ];

then

echo "hello $name"

elif [ $name = "asdf" ];

then

echo "name=$name"

else

echo "bye bye!"

fi

2、字符串判断

$string1 = $string2 : 两个字符串是否相等。Shell 大小写敏感,因此 A 和 a 是不一样的。

$string1 != $string2 : 两个字符串是否不同。

-z $string : 字符串 string 是否为空。

-n $string : 字符串 string 是否不为空。


3、数字判断

$num1 -eq $num2  : 两个数字是否相等。和判断字符串所用的符号( = )不一样。

$num1 -ne $num2 : 两个数字是否不同。

$num1 -lt $num2 : 数字 num1 是否小于 num2。

$num1 -le $num2 : 数字 num1 是否小于或等于 num2。

$num1 -gt $num2 : 数字 num1 是否大于 num2。

$num1 -ge $num2 : 数字 num1 是否大于或等于 num2。

4、判断文件

-e $file :文件是否存在。

-d $file : 文件是否是一个目录。因为 Linux 中一切都是文件,目录也是文件的一种。

-f $file : 文件是否是一个文件。

-L $file : 文件是否是一个符号链接文件。

-r $file : 文件是否可读。

-w $file : 文件是否可写。

-x $file : 文件是否可执行。

$file1 -nt $file2 : 文件 file1 是否比 file2 更新。

$file1 -ot $file2 : 文件 file1 是否比 file2 更旧。

5、测试多个条件

&&:逻辑与

||:逻辑或

!:非运算


示例:

1、

if [ $name = 'qwer' ] && [ -d $url1 ];

then

    echo "name为qwer,文件1是目录"

fi

2、

if [ ! -e $url1 ];

then

    echo "文件1不存在"

fi

6、测试多个条件case;case可以在匹配中做或匹配;示例如下:

case $userName in

"qwer" | "qw" | "er")

echo "用户名为qwer或qw或er"

;;

"asdf")

echo "用户名为asdf"

;;

"zxcv")

echo "用户名为zxcv"

;;

*)

echo "没有结果"

;;

esac

case $userName in :$userName 表示我们要测试的变量是输入的第一个参数。

"qwer") : 测试其中一个 case,也就是 $userName 是否等于 "qwer"。当然,我们也可以用星号来做通配符来匹配多个字符,例如 "q*") 可以匹配所有以 q 开头的字符串。

;;  : 类似于主流编程语言中的 break;,表示结束 case 的读取,程序跳转到 esac 后面执行。

*)  : 相当于 if 条件语句的 else,表示“否则”,就是“假如不等于上面任何一种情况”。

esac : case 的反写,表示 case 语句的结束。

8、循环

1、while循环

语法:

while [ 条件测试 ]

do

    做某些事

done

  示例:

while [ -z $userName ] && [ $userName != "asd" ]

do

read -p "请输入用户名:" userName

done

echo "用户名输入正确"

2、until循环

直到条件为真时才会结束循环

语法:

until [ $password = "123" ]

do

read -p "请输入密码:" -s password

done

echo "密码输入正确!"

3、for循环

示例1:

arr=("q" "w" "e" "r")

for item in ${arr[*]}

do

echo "输出:$item"

done

示例2:

for item in "a" "s" "d" "f"

do

echo "输出:$item"

done

示例3:

(ls *.sh  linux命令,列出当前目录以.sh结尾的文件)

for file in `ls *.sh`

do

echo "输出文件:$file"

done

示例4:

seq命令用于产生从某个数到另外一个数之间的所有整数。

seq语法:

seq [选项]... 尾数

seq [选项]... 首数 尾数

seq [选项]... 首数 增量 尾数

选项:

-f, --format=格式 使用printf 样式的浮点格式

-s, --separator=字符串,

使用指定字符串分隔数字(默认使用:\n)

-w, --equal-width 在列前添加0 使得宽度相同


指定格式:

示例1:seq -f "%3g" 9 11       

%后面指定数字的位数 默认是%g,%3g那么数字位数不足部分是空格。

输出:

  9

10

11


示例2:seq -f "str%03g" 9 11

输出:

str009

str010

str011

示例3:seq -w 98 101

输出:

098

099

100

101

示例4:seq -s '=' 1 5

输出:

1=2=3=4=5

9、函数

定义函数:函数的完整定义必须放置在函数调用之前

方式1:

函数名 (){

函数体

}

注:函数名后面的括号里面不能放置任何参数

方式2:

function 函数名 {

函数体

}


示例1:

testFun(){

echo "this is function!"

}

testFun

传递参数:

跟shell脚本传递参数相同

示例2:

testFun(){

echo "这是第一个参数:$1"

echo "这是第二个参数:$2"

}

testFun "测试" hello

testFun 1 23

返回值:

test(){

return 1

}

a=$(test)

return 只能返回整型,不能返回字符串

返回字符串:

test1(){

local str="this is string"

echo "返回字符串:$str"

}

b=$(test1)

echo "返回值:$b"

变量作用范围:

默认变量都是全局变量(global)

创建局部变量:local    local num1=12

重载命令:

ls(){

command ls -lh

}

ls

注意:如果没有 command 这个关键字(command 是英语“命令”的意思),那么程序会陷入无限循环。

  如果你不小心忘了 command 关键字而陷入无限循环,可以用 Ctrl + c 的组合快捷键来停止程序。

5、linux命令

pwd:展示当前路径

ls:列出目录文件

cp:拷贝

rm:移除文件

-i 向用户确认是否删除

-f强制删除

-r递归删除

find:查找  find . -name "test.txt"  (查找当前目录的test.txt文件)

cat:一次性展示文件的所有内容

用法:cat test.txt    显示行号:cat -n test.txt

less:分页显示文件内容

空格:显示下一页内容

回车:读取下一行内容

d:前进半页

b:后退一页

y:后退一行

u:后退半页

q:停止退出

head:显示文件开头(默认10行)

用法:head -n 20 test.txt  (显示文件开头20行)

tail:显示文件结尾(默认10行)

用法:tail -n 20 test.txt    (显示文件结尾20行)

touch:创建文件(同时创建多个后面跟多个文件名即可)

touch test2.txt

mkdir:创建目录

用法:mkdir  ceshi

mkdir -p one/two/three  (递归创建目录)

mv:移动文件或目录

用法:mv test.txt one    (将test.txt 移动到one目录下面)

grep:筛选数据

用法:grep 123 test.txt    在test.txt文件中筛选123

-i:忽略大小写

-n:显示行号

-v:只显示文本不在的行

-r:在所有子文件和子目录里面查找

还可以匹配正则  grep -E ^123 test.txt    查找以123开头的行

sort:排序

-r:倒序排列

-R:随机排序

-n:对数字排序

wc:文件统计

wc test.txt  返回值依次为:行数  单词数  字节数

-l:统计行数

-w:统计单词数

-c:统计字节数

-m:统计字符数

uniq:删除文件中重复的内容(原文件不会改变,只是输出的会删除)

cut:剪切文件的一部分

-c:根据字符数剪切

cut -c 2-4 test.txt  (test.txt 文件每行只保留第2到第4个字符)

-d:分割符(例如CSV文件 ,分割符被分为n列)

-f:区域(例如CSV文件,被分为n列后的某一列或某几列-f 1或-f 1,3或-f 2-或-f 2-5)

>和>>:重定向到文件

用法:cut -d , -f 2 test.csv > test1.txt  (会覆盖源文件的内容)

          cut -d , -f 2 test.csv >> test1.txt    (会追加到源文件的末尾)

    2>,2>>,2>&1:重定向错误输出

        文件描述符    名字         解释

                0            stdin        标准输入

                1            stdout       标准输出

                2            stderr        标准错误输出

        示例1:

            cat not_exist_file.csv > results.txt 2> errors.log

            > results.txt :将标准输出重定向到 results.txt 文件中;

            2> errors.log :将标准错误输出重定向到 errors.log 文件中。

        示例2:

            cat not_exist_file.csv > results.txt 2>&1

            2>&1 :将标准错误输出重定向到与标准输出相同的地方。

        示例3:

            cat not_exist_file.csv >> results.txt 2>&1

            将标准输出和标准错误输出都重定向到文件末尾,只需改前面的符号2>&1保持不变

<和<<从文件或键盘读取

cat < test.txt  从文件读取

wc -m << haha  从键盘读取,wc -m统计字符数,当键盘输入haha后结束


|管道,连接两个命令,命令1 | 命令2,命令1的输出->命令2的输入

用法:cut -d , -f 2 test.csv | sort >> test.txt

date:查看时间

ps:进程的静态列表

ps -ef 列出所有进程

ps -u qingclass 列出qingclass用户运行的进程

ps -aux 通过CPU和内存使用过滤进程

ps -aux --sort -pcpu  通过CPU使用率降序排列

ps -aux --sort -pmem  通过内存使用率降序排列

top:查看进程的动态列表

kill:结束进程

kill 1233  (1233为进程PID)

kill -9  1233    (强制结束进程)

&:在后台运行进程

control+z:暂停进程转到后台

bg:使进程转到后台

fg:使进程转到前台

fg 1 或者  fg %1    将编号为1 的进程转到前台

你可能感兴趣的:(初识shell)