Skip to content

liubin95/about-linux

Repository files navigation

Linux

文件和文件夹

万物都是文件

在Linux 系统中,几乎所有的东西都是文件,包括硬件设备、目录、文件等等。

Linux 常用 文件夹

文件夹 用途 备注
/ 根目录,保持越小越好,效率高,问题少
/bin 可执行文件,维护模式下可以使用的基础命令(所有用户) centos 已将文件移入/usr/bin。这里是链接
/boot 开机引导。
/dev 设备都会以文件的形式存在。/dev/sda 第一块磁盘 等等 /dev/null 空设备
/etc 所有的配置文件,包括系统,和其他服务。
/etc/opt 保存opt下第三方软件的配置文件
/lib 开机时用到的类库 同/bin,已移入 /usr/lib
/mnt 暂时挂载的设备
/opt 第三方软件
/sbin 可执行文件,维护模式下可以使用的基础命令(root用户) 同/bin,已移入 /usr/sbin
/tmp 临时文件
/usr 系统预设软件。因此这个目录有点类似Windows 系统的『C:\Windows\ (当中的一部份) + C:\Program files\』这两个目录的综合体 usr是Unix Software Resource的缩写
/usr/bin 一般用户使用的指令 FHS 要求在此目录下不应该有子目录
/usr/local 自行更新的预装软件。保留原来的,新的放置此处
/var 系统运行是变动的文件。包括缓存(cache)、登录档(log file)以及某些软件运作所产生的文件, 包括程序档案(lock file, run file),或者例如MySQL资料库的文件等等
/home 用户的home, cd ~ = cd
/lib* /lib 不同的格式的二进位函式库,例如 /lib64 64位函数库
/root root用户的home

CentOS 7 在目录的编排上与过去的版本不同。比较大的差异在于将许多原本应该要在根目录(/) 里面的目录,将他内部资料全部挪到/usr 里面去,然后进行连结设定!包括底下这些:

  • /bin --> /usr/bin
  • /sbin --> /usr/sbin
  • /lib --> /usr/lib
  • /lib64 --> /usr/lib64
  • /var/lock --> /run/lock
  • /var/run --> /run

bash

常用命令

  • echo 显示字符串
  • read 读取键盘输入
read -p "请输入用户名:" name
echo "你输入的用户名是:$name"
  • declare / typeset 声明变量类型
# -r 只读
# -i 整数
# -a 数组
# -x 导出
declare -r name="tom"
declare -i age=18+18 # age=36
age=18+18 # age=18+18
declare -a arr=(1 2 3)
echo ${arr[0]} # 1
declare -x name="tom"
  • alias 缩写
alias ll='ls -l --color=auto'
unalias ll
  • history 查看历史命令
# 查看历史命令
history
# 查看历史命令并执行
!n
# 执行上一个指令
!!
# 执行上一个以xxx开头的指令
!xxx
  • test 测试条件
  • expr 运算
  • source 读取并执行文件内容
source .bashrc
. .bashrc

资源限制 ulimit

# 查看资源限制
ulimit -a
# 设置资源限制
ulimit -c 1024 # core文件大小
ulimit -d 1024 # 数据段大小
ulimit -f 1024 # 文件大小
ulimit -m 1024 # 内存大小 **
ulimit -n 1024 # 打开文件数
ulimit -s 1024 # 栈大小
ulimit -t 1024 # cpu时间 **
ulimit -u 1024 # 进程数 **
ulimit -v 1024 # 虚拟内存
ulimit -x 1024 # 文件锁定数
# -S :soft limit ,警告的设定,可以超过这个设定值,但是若超过则有警告讯息。
# -H :hard limit ,严格的设定,必定不能超过这个设定的数值;

特殊字符

  • ~ 用户主目录
  • . 当前目录
  • .. 上级目录
  • * 通配符 代表『 0 个到无穷多个』任意字元
  • ? 通配符 代表『一定有一个』任意字元
  • [] 通配符 同样代表『一定有一个在括号内』的字元(非任意字元)。例如[abcd] 代表『一定有一个字元, 可能是a, b, c, d 这四个任何一个』
  • [-] 通配符 代表『一定有一个在括号内』的字元(非任意字元)。例如[a-d] 代表『一定有一个字元, 可能是a, b, c, d 这四个任何一个』
  • [^] 通配符 代表『一定有一个不在括号内』的字元(非任意字元)。例如[^a-d] 代表『一定有一个字元, 可能是a, b, c, d 以外的任何一个』
  • | 管道
  • > 重定向
  • >> 追加重定向
  • & 后台执行
  • # 注释
  • \\ 转义字符
  • ; 连续指令下达分隔符号:连续性命令的界定(注意!与管线命令并不相同)
  • () 子程序
  • {} 组合命令

重定向 > >>

标准输出指的是『指令执行所回传的正确的讯息』standard output (简称stdout),而标准错误输出可理解为『 指令执行失败后,所回传的错误讯息』standard error output (简称stderr) 。

  1. 标准输入 stdin 代码为 0
  2. 标准输出 stdout 代码为 1
  3. 标准错误输出 stderr 代码为 2
# 重定向
ll >test.txt
# 追加重定向
ll >>test.txt
# 重定向错误输出
ll 2>test.txt
# 重定向标准输出和错误输出
ll -123 >ll 2>err
# 丢弃标准输出
ll >/dev/null
# 丢弃标准错误输出
ll 2>/dev/null
# 同一个文件
ll >test.txt 2>&1
ll &>test.txt
# 读取键盘输入
cat >test.txt
# 文件作为输入 
cat >catfile <test.txt
# eof
cat >catfile <<eof
> 123
> 456
> eof

多命令执行

cmd;cmd

# 顺序执行
sync;
sync;
shutdown -h now

&& ||

# && 前面的命令执行成功后才执行后面的命令
cd /home
&& ls
# || 前面的命令执行失败后才执行后面的命令
cd /notexit
|| ls
# 判断目录是否存在,不存在则创建,然后创建文件
cd /home/test
|| mkdir -p /home/test
&& touch /home/test/test.txt

文字处理

  • tr 转换或删除字符
  • join 将两个已排序的文件按照相同的字段进行合并。在使用join 之前,你所需要处理的档案应该要事先经过排序(sort) 处理
# 选项与参数:
# -t :join 预设以空白字元分隔资料,并且比对『第一个栏位』的资料,
#       如果两个档案相同,则将两笔资料联成一行,且第一个栏位放在第一个!
# -i :忽略大小写的差异;
# -1 :这个是数字的1 ,代表『第一个档案要用那个栏位来分析』的意思;
# -2 :代表『第二个档案要用那个栏位来分析』的意思。
join -t ':' -1 4 -2 3 /etc/passwd /etc/group
| tail -n 10
  • paste 将多个文件的内容按行合并 将两行贴在一起,且中间以[tab] 键隔开
  • expand 将制表符转换为空格
  • unexpand 将空格转换为制表符
  • split 将文件分割成多个小文件
# split [OPTION]... [INPUT [PREFIX]]
# 选项与参数:
# -b :指定每个小文件的大小,单位为『块』;
# -l :指定每个小文件的大小,单位为『行』;
split -b 300k /etc/services services # 按照300k分割
split -l 100 /etc/services services # 按照100行分割
# 合并
cat services* >/etc/services
# 使用ls -al / 输出的资讯中,每十行记录成一个档案
ls -al /
| split -l 10 - ll
  • - 代表标准输入
# 管道命令中代替 filename
ls -al /
| split -l 10 - ll

编写shell

基础语法

#!/bin/bash
echo "hello world !"
exit 0
#!/bin/zsh
read -p "please input your name: " name
# 变量
echo -e "\n hello $name"
# 计算
echo "13*13=$((13 * 13))"
exit 0
#!/bin/bash
read -p "filename is :" filename
# 变量默认值
filename=${filename:-"default-name"}
date=$(date +%Y%m%d)
filename=${filename}-${date}
touch ${filename}
exit 0
#!/bin/bash
# cpu 计算。可以模拟cpu高负载。${num} 越大时间越长
time echo "scale=${num}; 4*a(1)"
| bc -lq
# bc -lq  90.32s user 0.63s system 98% cpu 1:32.68 total
exit 0

sh 和 source 的区别

#!/bin/bash
# sh 和 source 的区别
# sh 会开启一个子进程,source 不会
read -p "please input your name: " name
# sh 运行后 `echo $name` 为空
# source 运行后 `echo $name` 有值
exit 0

判断

test
# 1. 关于某个档名的『档案类型』判断,如test -e filename 表示存在否
# -e 是否存在;-f 是否为普通文件;-d 是否为目录
test -e /etc/passwd
&& # 2. 关于某个数值的『比较判断』,如test 100 -gt 99 表示『大于』否
# -eq 等于;-ne 不等于;-gt 大于;-ge 大于等于;-lt 小于;-le 小于等于
test 100 -gt 99
&& echo "yes"
|| echo "no"
# 3. 关于某个字符串的『比较判断』,如test "abc" == "abc" 表示『相等』否
# == 等于;!= 不等于
test "abc" == "abc"
&& echo "yes"
|| echo "no"
# 4. 关于某个文件的『权限判断』,如test -r filename 表示『可读』否
# -r 是否可读;-w 是否可写;-x 是否可执行
test -r /etc/passwd
&& echo "yes"
|| echo "no"
# 5. 多重判断
# -a 与;-o 或;! 非
test -e /etc/passwd -a -r /etc/passwd
&& echo "yes"
|| echo "no"
# 6.正则表达式判断
# =~ 匹配
test "abc" =~ "a"
&& echo "yes"
|| echo "no"
#!/bin/bash
# 这个档案是否存在,若不存在则给予一个『Filename does not exist』的讯息,并中断程式;
# 若这个档案存在,则判断他是个档案或目录,结果输出『Filename is regular file』或 『Filename is directory』
# 判断一下,执行者的身份对这个档案或目录所拥有的权限,并输出权限资料!
read -p "input filename :" filename
test -z $filename
&& echo "you must input a filename."
&& exit 0
test ! -e $filename
  && echo "the filename '$filename' DO NOT exist"
  && exit 0
test -f $filename
  && filetype="regular file"
test -d $filename
  && filetype="directory"
test -r $filename
  && perm="readable"
test -w $filename
  && perm="$perm writable"
test -x $filename
  && perm="$perm executable"
echo "the filename: $filename is a $filetype perm is $perm"
[]
#!/bin/bash
# 在中括号[] 内的每个元件都需要有空白键来分隔;
# 在中括号内的变数,最好都以双引号括号起来;
# 在中括号内的常数,最好都以单或双引号括号起来。

# 当执行一个程式的时候,这个程式会让使用者选择Y 或N ,
# 如果使用者输入Y 或y 时,就显示『 OK, continue 』
# 如果使用者输入n 或N 时,就显示『 Oh, interrupt !』
# 如果不是Y/y/N/n 之内的其他字元,就显示『 I don't know what your choice is 』
read -p "please input (Y/N):" yn
[ "$yn" == "Y" -o "$yn" == "y" ]
&& echo "OK, continue"
&& exit 0
[ "$yn" == "N" -o "$yn" == "n" ]
  && echo "Oh,interrupt"
  && exit 0
echo "I don't know what your choice is"
exit 0
if
#!/bin/bash
read -p "please input (Y/N):" yn

if [ "$yn" == "Y" ]
|| [ "$yn" == "y" ]; then
  echo "OK, continue"
elif [ "$yn" == "N" ]
  || [ "$yn" == "n" ]; then
  echo "Oh,interrupt"
else
  echo "I don't know what your choice is"
fi
exit 0
case
#!/bin/bash
# case 语句可以匹配一个值与一个模式,如果匹配成功,那么执行相匹配的命令。
read -p "please input (Y/N):" yn
case "$yn" in
  [Yy]) echo "OK, continue" ;;
  [Nn]) echo "Oh,interrupt" ;;
  *) echo "I don't know what your choice is" ;;
esac
exit 0

预设变量

#!/bin/bash
# /path/to/scriptname opt1 opt2 opt3 opt4
# $0 $1 $2 $3 $4
# $# 传递给脚本的参数个数 4
# $@ 传递给脚本的所有参数 "opt1" "opt2" "opt3" "opt4"
# $* "opt1 opt2 opt3 opt4" c为分隔字元,预设为空白键
echo "script name is $0"
echo "$#"
echo "$@"
echo "$*"
exit 0

function

#!/bin/bash
# function
# [function] function_name() { commands; }
# 因此在shell script 当中的function 的设定一定要在程式的最前面
# 参数 $1 $2 $3 $4 
# $0 方法名
function print_text() {
  echo -n "text is $1"
}
print_text "function_name"
exit 0

循环

while/until
#!/bin/bash
# 输入yes 程序停止
#『当condition 条件成立时,就进行循环,直到condition 的条件不成立才停止』
while [ "$yn" != "yes" ]; do
  read -p "input yes to stop:" yn
done
# 『当condition 条件成立时,就终止循环, 否则就持续进行循环的程式段。』
until [ "$yn" == "yes" ]; do
  read -p "input yes to stop:" yn
done
exit 0
for
#!/bin/bash

# 列表
for var in dog cat elephant; do
  echo "There are ${var}s.... "
done
for file in $(ls); do
  echo "file is $file"
done

# 数字 或者字母
#  {a..g} 代表 a b c d e f g
sum=0
for i in {1..5}; do
  sum=$(($sum + $i))
done
echo "sum is $sum"

# 
for (( i = 0; i < n; i++ )); do
  echo "i is $i"
done

# 读取文件
for i in $(cat /etc/passwd); do
  echo $i
done

exit 0

sh

#!/bin/bash
# sh
# sh -x scriptname # 执行脚本并打印出每一行的命令 debug
# sh -n scriptname # 检查脚本的语法是否正确
# sh -v scriptname # 执行脚本并打印出每一行的命令 

多人多工

多人

多人是指多个用户同时登录系统,每个用户都可以执行自己的任务,而且不会影响到其他用户的任务。

多工

多工是指一个用户可以同时执行多个任务,而且不会影响到其他任务的执行。

About

every thing about linux

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages