操作系统

常用命令

1
2
3
4
5
6
7
8
9
10
11
touch
cat
mv
rm
mkdir
rmdir
head
tail
cd
ls
find

Linux的系统运行级别

Linux有7个运行级别:0-6

0:关机

1:单用户模式,系统出现问题时可使用这种模式进入系统保护,典型的使用场所是在忘记root密码时可以进入此模式修改root密码。

2:多用户模式,但是没有网络连接

3:完全多用户模式,Linux服务器最常见的运行级别

4:保留未使用。

5:窗口模式,支持多用户,支持网络。

6:重启。

在/etc/inittab中设置。

显示日期

1
# date

用户管理

1
# useradd john
1
# passwd john
1
# userdel john
1
# groupadd group1

查看用户

1
2
3
# users
# who
# w

文件

1
# touch text.txt
1
# cat text.txt

移动或重命名文件

1
# mv text.txt
1
# rm text.txt

显示文件前10行的内容

1
# head text.txt

显示文件最后10行的内容

1
# tail text.txt

动态地查看文件尾,即时显示动态更新的内容。

1
# tail -f text.txt
1
# cd
1
# mkdir
1
# rmdir
1
# rm -r
1
# cp
1
# cp -r
1
2


1
# find /etc -name httpd.conf
1
# tar -zxvf boot.tgz

-v:显示当前被压缩的文件

-f:使用文件名

1
2


1
2


查看日志

  1. 1
    # head -n 10 test.log
1
# tail -n 10 test.log
  1. 1
    2
    3
    4
    5
    6
    7
    8
    (显示日志里匹配字串那行以及前后5行)
    # cat filename | grep -C 5 '关键字'

    (显示匹配字串及前5行)
    # cat filename | grep -B 5 '关键字'

    (显示匹配字串及后5行)
    # cat filename | grep -A 5 '关键字'

4.

在Linux文件系统中,所有文件都会有一个编号,称为inode,多个文件名指向同一索引结点是被允许的,这种链接就是硬链接。

显示文件的inode,加-i参数

1
# ls -li

硬链接又称为实际链接,是指通过索引节点来进行链接。

硬链接的作用是允许一个文件拥有多个有效路径名,这样用户可以建立硬链接指向同一文件,删除一个硬链接并不会影响索引节点本身和其他的硬链接,只有当最后一个硬链接被删除时,文件的数据块及目录的链接才会被释放。文件真正被删除的前提条件是与之相关联的所有硬链接均被删除。

硬链接的限制:

  1. 不允许给目录创建硬链接

  2. 只有在同一文件系统中的文件之间才能创建硬链接,即不同分区上的两个文件之间不能创建硬链接。

创建指向hard01的硬链接hard01_hlink,它们指向的inode值是一致的

1
# ln hard01 hard01_hlink

软链接又称为符号链接(symbolic link),是指包含另外一个文件的路径名的文件,可以指向任意文件或目录,也可以跨不同的文件系统。

软链接和Windows的快捷方式十分类似。

删除软链接并不会删除其所指的源文件,如果删除了源文件则软链接会出现“断链”。

1
# ln -s file01 file01_slink

管道

管道是一个固定大小的缓冲区,该缓冲区的大小为1页,即4K字节。

管道表现为输入输出重定向的一种方法,它可以把一个命令的输出内容当做下一个命令的输入内容,两个命令之间只需要使用|连接符即可。

grep:文本搜索

grep是基于行的文本搜索工具

命令格式:

1
# grep [-ivnc] 'str' file

sort(排序)

1
# sort [-ntkr] file
1
# cat sort.txt | sort -t ":" -k 2 -n -r

ps

-e:显示所有进程

-f:显示完整格式的进程信息

1
# ps –ef

查找特定进程

1
2
# ps -ef | grep sshd
# ps -ef | grep dhcpd

查找进程的PID

1
# pidof dhcpd
1
2
# kill pid
# kill 2877
1
2
# kill name
# kill httpd

losf还可以查看使用了某个端口的进程

1
# lsof -i:22

13

变量

Shell变量是一种弱类型的变量,不需要指定类型,也不需要先声明再使用。

  1. 局部变量:只在某个Shell中生效,不影响其他Shell。

  2. 环境变量(全局变量):在Shell脚本中,变量默认是全局变量,无论在脚本的任何位置声明。

将父Shell的变量导出为环境变量。

可以用在创建该变量的父Shell中和从该父Shell派生的任意子Shell或进程中。

1
# export VAR=value

注:等号=两端没有空格。

从一个Shell中创建子Shell

1
# bash

环境变量只能向下传递不能向上传递。

变量命名

Shell变量名区分大小写。

###

变量的赋值

值的引号可以用单引号也可以用双引号。

1
2
# name=john
# name="john Sam"

如果是将其他变量赋值给该变量,必须使用双引号

1
# name1="$name"

变量的取值:使用$符号,严谨的写法是${}

1
2
# echo $name
# echo ${name}

###

取消变量

1
# unset $name

取消函数

1
#unset u_function

###

  • $0:脚本本身
  • $1 / $2 / $3:第n个参数
  • ${10}:当参数的位置>=10的时候,需要用${}括起来标识
  • $#:脚本参数的个数
  • $@ / $*:脚本所有的参数
  • $?:上一个命令的返回值

Linux中规定正常退出的命令和脚本以0作为其返回值,任何非0的返回值都表示命令未正确退出或未正常执行。

数组

Shell变量是弱类型的,不要求数组的每个元素是相同类型的。

Shell中的数组对元素个数没有限制,但是只支持一维数组。

Shell中的数组随时可以增加元素,数组长度可以改变。

声明数组

1
2
3
# declare -a Num
# Num[0] = 0
# Num[1] = 1
1
# declare -a Name=('john', 'sue')
1
# Name=('john', 'sue')

增加元素

1
# Name[2]='Sam'

为特定元素赋值,跳号赋值

1
# Score=([3]=3 [5]=5 [7]=7)

数组操作

取出元素的值

1
# echo ${Name[0]}

取出所有元素的值

1
# echo ${Name[@]}
1
# echo ${Name[*]}

数组的长度

1
2
# echo ${#Name[@]}
# echo ${Name[*]}

#用来返回个数

1
# echo ${#Name[2]}

14. 测试和判断

测试结构

  1. test expression

  2. [ expression ]

expression与[]之间必须有一个空格

文件测试

method description
-d FILE 当文件存在且是个目录时返回为true,否则返回false
-e FILE 当文件或者目录存在时返回为true,否则返回false
FILE1 -nt FILE2 当FILE1比FILE2新时返回true,否则返回false
FILE1 -ot FILE2 当FILE1比FILE2旧时返回true,否则返回false

if结构

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash
echo -n "Please input a score:"
read SCORE
if [ "$SCORE" -lt 60 ]; then
echo "C"
fi
if [ "$SCORE" -lt 80 -a "$SCORE" -ge 60 ]; then
echo "B"
fi
if [ "$SCORE" -ge 80 ]; then
echo "A"
fi

if-else结构

1
2
3
4
5
6
7
8
#!/bin/bash
FILE=/var/log/messages

if [ -e $FILE ]; then
echo "$FILE exists"
else
echo "$FILE not exists"
fi

if-elif-else结构

1
2
3
4
5
6
7
8
9
10
#!/bin/bash
echo -n "Please input a score:"
read SCORE
if [ "$SCORE" -lt 60 ]; then
echo "C"
elif [ "$SCORE" -lt 80 -a "$SCORE" -ge 60 ]; then
echo "B"
else
echo "A"
fi

switch-case结构

1
2
3
4
5
6
7
8
9
10
11
12
# 检测当前的操作系统

#!/bin/bash
OS='uname -s'
case "$OS" in
FreeBSD) echo "This is FreeBSD" ;;
CYGWIN_NT-5.1) echo "This is Cygwin" ;;
SunOS) echo "This is Solaris" ;;
Darwin) echo "This is Mac OSX" ;;
AIX) echo "This is AIX" ;;
*) echo "Failed to identify this OS" ;;
esac
1
2
3
4
5
6
7
8
9
10
11
# 检测用户的输入中是否含有大写字母、小写字母或者数字

#!/bin/bash
read -p "Give me a word: " input
echo -en "You gave me some "
case $input in
*[[:lower:]]*) echo -en "Lowercase " ;;
*[[:upper:]]*) echo -en "Uppercase " ;;
*[[:digit:]]*) echo -en "Numerical" ;;
*) echo "unknown input." ;;
esac

带列表的for循环