Linux笔记

Linux 常用命令

相关内容:
1. 用which ls可以查看ls命令在哪里,一般在bin下。
2. 为外部命令,相对于Bash的内置命令,如while等。
3. 同名的内置命令比外部命令优先级高。

查看文件清单 ls

  • ls -a :查看所有,包括隐藏文件和目录
  • ls -lat : 查看所有文件的详细信息,按照修改时间排序。
  • ls -lu : 查看访问时间
  • ls -lc : 查看状态改动时间
  • stat 可以直接看文件三种时间且更精确

total:一共占几个block,在linux中一个block的大小是512b。
第一列前十个字符中:
- 1表示类型:d 目录;l 符号链接; - 普通文件
- 2-4个表示文件所有者权限:r 读; w 写; x 执行
- 5-7表示文件所属组其他账户权限
- 8-10表示所有不同组的其他账户权限
第二列:对文件表示硬链接数;对目录表示所含子目录数(包括隐藏目录)
第三列:文件所有者
第四列:所有者所属组
第五列:字节数
第六列:文件修改时间
第七列:文件名

浏览文件 cat,more,less,head,tail

文件统计 wc

stark@ubuntu:~$ wc /etc/passwd
40 69 2241 /etc/passwd
行 单词数 字节数(换行符‘\n’也算一个字节)

改变当前目录 cd

  • cd .. :进入父目录
  • cd ../..:上两级
  • cd - :返回刚才路径
  • cd ~stark :进入账户名为stark的账户主目录

创建目录 mkdir

  • mkdir -p test1/test2 :一口气创建2个目录

复制 cp

  • cp -r dir1 dir2 : 递归复制文件夹
  • cp -b a.txt b.txt : 若已存在 b.txt 则将原来的 b.txt 备份为 b.txt.~,防止意外覆盖
  • cp -f a.txt b.txt : 强行拷贝,当账户对b.txt没有写权限时使用,没有提示
  • cp -i a.txt b.txt : 与上面一样,但有提示

重命名或移动 mv

  • mv file1 file2 :重命名
  • mv -b file1 file2 : 备份重命名
  • mv file1 dir1 : 移动到某一目录

创建符号链接和硬链接 ln

符号链接:和windows的快捷方式差不多,字节数为源文件名
- ln -s a.txt b.txt : 创建b.txt为a.txt的符号链接,a.txt不存在时也可执行(断链,符号链接为红色)
- rm b.txt : 删除该符号链接
注:删除原文件后,将不可打开链接文件。

硬链接:和普通文件一样,创建前源文件必须存在,两者状态一致(除了名字外全部一致,包括权限等等)
-ln a.txt b.txt

显示当前目录 pwd

产生空文件或改变文件时间戳 touch

  • 文件存在:改变修改时间为当前时间
  • 文件不存在:创建一个文件

查看账户名及其所属组 whoami,id,groups

改变权限 chmod

[ugoa][+-=][rwx-]
u用户,g组,o其他账户,a所有账户;
也可用数字表示权限

SUID SGID SBIT

删除

  • rm file:删除文件
  • rm -r dir : 递归删除非空目录
  • rm -rf dir : 去掉权限保护提示‘确认删除?’,直接进行删除(用于文件件有只读文件)
  • rmdir dir : 删除空目录(不常用)

查看文件类型 file

树状目录 tree

Bash内置命令与环境

命令行提示 PS1

可改,形式:
PS1=".."
这是一个变量,用set可以看到所有全局变量和函数;用env或printenv看环境变量。

环境变量 PATH

查看
echo $PATH
结果以冒号隔开

添加
$PATH="$PATH:/tmp/bin"

主目录下.bashrc隐藏文件用于设置自己的环境配置,包括PS1..,每次打开命令行都会执行。

设置和取消别名 alias,unalias

alias ls="ls -lat"
unalias ls

权限掩码命令 umask

在复制时,掩码的作用是拿走能够拿走的权限。

改变命令解释顺序

  1. command <命令>:按照内置和外部命令来处理。
  2. builtin <命令>:只查找内置命令。
  3. enable <命令>:禁用(-n)或使能内置命令 。

重名时,Bash命令解释顺序:
alias->keyword->function->built-in->$PATH
即:
别名->关键字->函数->内置命令->外部命令

查询命令类型:
type -t <命令>

命令退出状态&命令的true和false

每一个命令或程序结束后都会返回一个退出状态,0-255。0为成功,其余均失败,127未找到命令。
内置变量&?存储着上一条命令的退出状态。
特殊内置指令:均不执行任何操作,true返回0,false返回1。

管道

左边执行结果通过管道(|)传给右边执行
Ex. ls -la|more
分页查看文件信息

输入输出

执行一个shell文件自动打开标准输入文件(stdin)和标准输出文件(stdout),分别对应终端键盘和终端屏幕,对应文件描述符0和1。
wc <文件>,文件是输入,行数(有几个回车就有几行)、单词数、字节数是输出。
标准输入如:
wc 回车 然后写内容

命令的进一步讨论

命令的后台执行
末尾加 &

cp a.txt b.txt &
[1] 6170
一个工作号 一个进程号

续行
续行符 \

echo “ss\
>sad”
sssad
这里的>即是PS2的值。

命令的自动补全
<Tab>

windows linux 文件互转
windows下,文件换行符为\r\n
linux下,是\n
用命令dos2unix进行转换。

子shell

小括号括起来的命令是在子shell中执行的,用ps命令可以看到当前进程状态。

变量

定义与清除

$age=21
$echo $age
21
$unset age
$echo $age

#空行
$

单引号与双引号

单引号里面的变量将不带入值,原封不动输出。双引号会带入。

大括号

  1. 大括号是变量名字的定界符
  2. 分配?
    $ echo a{b,c}d
    abd acd

    $ mkdir test/{1,2,3}
    一下子建三个子目录

将命令结果赋给变量

  1. a=`date`
  2. a=$(date)

也可放于另一指令中:
$ echo Now,time is $(date)

键盘输入变量值 read

$ read var
xxx
$ echo $var
xxx

当未指定变量名称时,将输入的值放入内置变量REPLY中。

$ read -t 5 -p "input a number:" num
设置5秒,超时未输入则退出该命令,内置变量TMOUT为超时时间,默认没有值,如果该值大于0,则在等待该时间后没有收到任何输入,当前命令/shell会自动退出。
此外 -n 来限制输入个数;-s 输入看不到(输密码);-u fd 用文件描述符给变量赋值。

整型变量运算

  1. 用双括号
    ((z=x+y))
  2. 用let
    let z=x+y

Bash只有整型数,无法整除时丢弃小数点后面的数。
若要进行浮点运算,要使用bc或awk.

从本质上来说,Bash只有字符型变量,整型(integer)只作为一种属性,此外,还有只读(readonly)属性,数组属性(array)等,分别可以用declare -i / declare -r /declare -a 来赋予。

导出变量 export 或 declare -x

由于子shell中默认无法继承父shell的变量,可以用export var来实现继承,对子shell的子shell…都有效。为什么叫export呢?
实际上,用set可以看到当前shell的按照字母排序的所有普通变量、数组、环境变量和函数定义等。

数组

Bash只支持一维数组。
创建
y=(aa bb cc)
read -a y
aa bb cc

查看
${y[*]}查看所有元素
${#y[*]}查看数组长度
declare -p y查看数组状态

关联数组
和字典一样,索引可以不是数字
declare -A age=([Mike]=11,[Jack]=22,[Tom]=20)

字符串操作

awk与sed工具可以实现更多操作,但就运行效率来讲没有内置的操作快。

if

if 命令
then
命令组
fi

if 命令; then 命令组; fi

注意:Bash中作为判断的可以是任意语句,因为if是根据命令的返回状态来进行判别的,单纯的if expr 4 + 3 也是可以的,因为他计算成功返回0,如:
$ if expr 5 + 1 > temp;then echo "5+1=$(<temp)";fi
5+1=6

case

case 变量 in
模式[|模式…])
命令组;;
模式[|模式…])
命令组;;

esac

用exit退出当前shell。退出状态默认是上一条语句的,也可自带参数表示exit退出状态。

for

for 变量 [ in 列表 ]
do
命令组
done

for (( 表达式1;表达式2;表达式3));do 命令组;done

其他常用命令

计算表达式值 expr

expr表达式中运算符两边必须有空格(否则误认为字符串?)
$ expr 3 + 1
4

$ expr "a.txt" : '.*\.\(.*\)
txt'

提取后缀名。

条件判断 test

两种方式,用$?看返回状态,1为false,0为true.
- test 10 -lt 2010小于20?
-[ 10 -lt 20 ] 表达式与前后中括号之间要有空格,为什么呢?因为bash中[也是一个内置命令,故 [4 就找不到命令了。

-$ [ \("abc" \< "efg" \) -a \(10 -le 20\)]一个中括号内使用小括号大于小于要加反斜杠,等价于:$ [[ "abc" < "efg" && 10 -le 20 ]]

判断变量是否定义
1. set里面找
2. test -v 变量
3. [ -v 变量 ]

移动位置参数 shift

Bash有特殊变量 $N 表示脚本或函数的位置参数,用 $#显示位置参数个数,$带头的还有很多特殊变量,不赘述。那么shift的作用是将位置参数左移一个,见:
$ cat shift.txt
#!/bin/bash
while [ $# -gt 0 ]
do
echo $1
shift
done

$ sh shift.txt 10 20 30
10
20
30

<CTRL+D> & <CTRL+C>区别

<CTRL+D>是Linux下的EOF,退出一个命令;
<CTRL+C>比较强制,退出整个shell。

select & case 配合

$ cat select.txt

#!/bin/bash
PS3="please select your favorite vegetable:"
select vegetable in "bean" "tomato" "carrot" "onion"
do
case $REPLY in
1|3)
echo "you select $vegetable, the price is 2.22"
break ;;
2|4)
echo "you select $vegetable, the price is 3.22"
break ;;
*)
echo "input error!"
;;
esac
done

这里,在select命令运行时,会自动给列表里面的每个变量加上编号,用户选择的编号会存放于内置变量REPLY中,故可以用$REPLY来获得用户输入。

使脚本运行,若直接用sh select.txt 报错:select: not found
改成bash select.txt则可以。这是为什么呢?
因为使用sh调用执行脚本相当于打开了bash的POSIX标准模式
(等效于bash的 –posix 参数)。一般的,sh是bash的“子集”。

获得多个参数的方法 getopts

当脚本要获得多个参数,然后对各个参数进行操作时,(就像 ls - l -a),一般方法:

· 用$1每次提取第一个参数,配合使用shift,一个个进行处理,但遇到 ls -al时便出问题了,难道每种排列组合都放到case?所以,一般使用下面方法:

· getopts 会对参数一个个进行提取,不废话,看例子更容易理解:

`$ cat getopts.txt

#!/bin/bash
while getopts aw: OPTION
do
case $OPTION in
a) echo Good afternoon!
;;
w) week=$OPTARG
echo "Week${week}!"
;;
*) echo "Usage is : $0 [-a] [-w number]"
exit 1;
;;
esac
done

w后面冒号表示这是个带参数的参数,该参数存于OPTARG内。

过滤器 grep & egrep

Bash 模式匹配 extglob

这并不是一个命令,而是一个选项,默认关闭,打开方式:
shopt -s extglob
例:
$ name=Tommy
$ shopt -s extglob
$ [[ $name == [Tt]o+(m)y ]]
$ echo $?
0

剪取内容 cut

合并相应行 paste

paste file1 file2 file3

结果
file1第1行file2第1行file3第1行
file1第2行file2第2行file3第2行

中间默认以Tab键隔开

转换或删除字符 tr

如大小写转换:
$ tr [a-z] [A-Z] <test.txt

排序 sort

默认以字符串方式进行排序,若要对数值进行排序,用-n

函数

基本形式

function 函数名
{
xxx
}

函数名()
{
xxx
}

写在一行时,大括号间需加空格,后括号的空格前还要加分号。

函数名(){ xxx; }

注:函数内变量默认和全局变量是一样的,除非加上local或declare。

declare -f 查看函数定义

流编辑器 sed

常用于字符串替换上,比vi方便。

替换 s

基本形式:
sed [选项] ‘s/regexp/replacement/flags’ file
$ echo "Linux Linux Linux" | sed 's/Linux/UBUNTU/1
UBUNTU Linux Linux

二次扫描 eval

第一次进行变量值替换,第二次将参数作为shell命令执行。

文本处理工具 awk

awk是以文本为驱动的,逐行扫描文本执行处理。
awk '命令' file

$ awk '{print $0}' awk.txt
Jack boy 89
Amy girl 90
Lucy girl 87
Mike boy 88

其中$0表示所有列

$ awk '{sum=sum+$3} END{print sum/NR}' awk.txt
88.5

相对于一般模块的每行执行,END后面模块最后执行,且仅最后执行一次,上面代码用于计算第三列平均值。

awk中的if

$ awk '{if($3>88){print $0}}' awk.txt
Jack boy 89
Amy girl 90

awk中的数学函数

$ awk 'BEGIN{print int(15.55),sqrt(3)}'
15 1.73205

int()函数取整;sqrt开方;BEGIN先于文本输入之前执行,故用BEGIN模块可以不用文本输入。

进程 & 作业

· ps查看进程;jobs查看作业
· 作业号仅在当前窗口有效;进程号在整个系统都有效
·

发送信号 kill

kill [-s 信号名 | -n 信号编号 | - 信号名 | - 信号编号 ] 作业号或进程ID

等待命令 wait

等待某一进程结束,不带参数时表示等待当前shell的所有子进程都结束。

捕获信号 trap

trap commands signals
表示当收到signals(空格间隔)时执行commands(分号间隔)
$ trap 'echo I stop now!;exit' 2
$ while(true) do echo "hhh";done
信号2是中断,也就是

遇到的问题

以独占方式锁定此配置文件失败

一般是前一次非正常关闭Ubuntu系统所致。
办法:
首先删除虚拟机Ubuntu系统目录下的以.lck结尾的文件夹,
之后windows下任务管理器,结束进程vmware-vmx.exe
即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值