Linux命令行和shell编程
Shell
- Shell是一个程序,用户输入的命令通过shell来传达给内核或其它程序。用户在linux打开一个终端,终端就会自动调用用户的shell.
- Linux上的Shell有很多种,用的最多是shell是bash, 全路径是 /bin/bash. 每个用户的shell可以不一样,具体配置放在 /etc/passwd文件种。
Bash
echo $PATH
显示linux的环境变量,$用来引用一个变量,bash执行命令的时候就是去PATH指定的路径种寻找的。export test="hello world"
使用export声明一个变量。- 按一次TAB键会尝试补全命令,连按两次TAB键则会列出所有相关的命令。
history 20
列出最近执行过的20条命令。
常见目录
- /usr 存放从软件源中安装的软件
- /usr/local 存放其它地方安装的软件。
- /bin , /usr/bin , /usr/local/bin 存放普通用户可以执行的程序或命令。
- /sbin, /usr/sbin, /usr/local/sbin 存放root用户可以执行的程序和命令。
- /home 用户家目录的根目录
- ~ 用户家目录
- ./tmp 当前目录下的tmp目录。 点表示当前目录。
帮助命令
- man ls
- more ls 可以通过enter键向下翻页,翻到最后一页自动退出。
- less ls 可以上下翻页。
- 以上命令可通过按q 键退出。
管道符
ps -A|more ps命令的输出作为more命令的输入。
通配符
Linux的通配符一般都由bash来处理。
例如 cp *.jpg ./tmp 则bash会先将*.jpg 解析成a.jpg b.jpg ... 然后再传给 cp来处理。
cp \*.jpg ./tmp 文件名本身是 *.jpg 则要使用转义符 \。
* 代表任意多个任意的字符, ? 代表任意一个字符。
常用命令
hostname
显示主机名uname
显示当前操作系统信息firefox &
启动火狐浏览器,并让火狐在后台运行,不影响当前命令行环境。任何命令后跟 & 就表示该命令在后台运行。- ctrl + c 会终止当前正在运行的命令。
- 什么也不输入的情况下连按两个tab键会列出目前系统所有的命令。
- 历史命令:history 查看执行过的命令; !! 执行前一个命令;!un 执行前面执行过的以un开头的命令; !num 执行history列出的第num个命令;!?ea 执行前面执行过的包含ea的命令;!-n 执行n个命令之前的那个命令。 ctrl + r 可以搜索历史命令,搜索条件为历史命令中包含的任意字符串。 按Esc后按点键,会列出上一个命令的参数。
id
显示当前用户信息。passwd
修改当前用户密码。su -
切换到root用户并使用新的shell环境,su
切换到root用户但是不创建新的shell环境。- 暂停某个程序:ctrl + z 或者发送信号17
- 查看后台进程: jobs
- 暂停进程500秒:sleep 500
- 继续运行暂停的后台进程:
bg 2
- 继续在前台运行暂停的进程
fg 2
常用命令进阶
- 日期时间:date 查看设置当前系统时间,
date -u
显示 UTC时间,date %Y--%m--%d
格式化显示为:2017--10--05,date -s '20:20:30'
设置时间。 - 显示硬件时钟时间,就是主板上记录的时间:
hwclock
或clock
- 查看日历:
cal
- 查看系统运行时间:
uptime
- 显示输入的内容:
echo aaa
显示 aaa - 查看纯文本文档的内容:
cat txt1
head -20 txt1
显示 txt1文件的前20行内容tail -20 -f log1
显示log1的最后20行内容,并追踪文件的更新,该命令用来查看日志非常方便。more txt1
翻页显示文件内容,只能向下翻页。空格键翻页。less txt1
翻页显示文件内容,可上下翻页。page down , page up 上下翻页。lspci
查看PCI设备lsusb
查看USB设备lsmod
查看加载的模块,linux中的模块一般指驱动。shutdown
, -h 关机, -r 重启。shutdown -h now
立即关机;shutdown -h +10
10分钟后关机;shutdown -h 23:10
23:10关机;shutdown -r now
立即重启。- poweroff 立即关机。
- reboot 立即重启。
- 压缩:zip命令
zip zip1.zip file1
,gzip命令gzip linuxcast.net
- 解压缩:
unzip zip1.zip
- 打包归档文件,即把多个文件打包成一个文件:
tar -cvf out.tar /dir1
将/dir1文件夹归档成out.tar;tar -xvf out.tar
将out.tar 抽出出来,是归档的反操作;tar -cvzf back.tar.gz /etc
将 /etc 归档并压缩成back.tar.gz - 查找文件:
locate zy1
快速查找名为zy1的文件或文件夹,locate 是从数据库查找,所以速度快,数据库默认一天一更新,所以新加的文件可能找不到,可通过 updatedb 手工创建或更新数据库。 - 高级查找文件,文件夹:find 命令,根据指定位置查找,保证实时性,速度较慢,
find . -name *zy*
在当前位置查找文件名包含zy的文件;find / -perm 777
在根目录下查找所有权限为777的文件;find / -type d
返回所有目录类型的文件;find . -name "zy*" -exec ls -l {} \;
将查找的结果作为参数传给 exec 和 {}; 之间的命令,大括号和反斜线之间有个空格。
Shell编程
示例脚本1 各种变量,输出语句。
执行结果:
说明如下:
-
用户变量不用声明,随用随写,如上面的userVar1, userVar2 ,用户变量也可用${varName} 来引用
-
环境变量可以随时用,如上面的 HOME
-
全局变量用 export 关键字声明,在当前会话结束后失效。
-
一些特殊符号变量:
--$n 外部传入的第n个变量,n为0到9,0代表本脚本的名称。
--$* 代表外部传入的所有变量,不包括第0个变量。
--$# 外部传入的变量的个数。
--$$ 当前执行脚本的PID。
-
反引号中间的命令会被执行后输出,如上面的
date +%Y%m%d
-
shell的变量只有一种类型:字符串,所以要进行算术计算,需要用到expr命令:
expr 后面的都是参数,所以需要有空格,变量不需要空格。
脚本2 函数和if语句
-
shell 脚本的注释用 #开头,但是如果是 #后紧接着一个感叹号,并且位于文件的第一行,那就不是注释了,是用来说明执行这个脚本需要哪个shell。
-
shell中调用函数不要加括号,直接写名称即可。
-
左中括号 [ 是一个命令! 位于 /usr/bin 下,用来判断后面表达式的真假。 后面的都是参数,而且最后一个参数必须是右中括号。因为后面的都是参数,所以参数之间要有空格。
-
if 后面也可以跟命令,比如 if ls -l /home; then
-
文件判断参数
---d $path 判断目录是否存在。
---f $file 判断文件是否存在
---e $pathname 判断文件或目录是否存在。
-
算术比较运算,比较的是数值。
--$num1 -eq $num2 判断连个数是否相等。
---ne 判断不等。
---lt 判断小于。
---le 判断小于等于。
---gt 判断大于。
---ge 判断大于等于。
-
字符串比较
--$str1 = $str2 两个字符串是否相等。
--$str1 != $str2 两个字符串是否不等。
---z str1 字符串长度是否为0
---n str1 字符串长度是否不为0.
示例脚本3 case 语句
- 语法: case .. in 1) .. ;; 2) .. ;; *) ...;; esac.
- 每个case 的最后一行代码且只有最后一行代码要加两个分号表示结束。
- for 语句有两种写法,见上图。
- in 后面是一个列表
- 如果是第二中写法,要用两个小括号。
- break , continue 和普通编程语言的一样。
while 语句
while 循环调节
do
code ....
done