初识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 的进程转到前台

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342