Linux 笔记
删除
x 小写的x表示向后删除一个字符,也就是删除光标所在字符
nx n表示数字,表示向后删除每个字符,例如:10x表示删除包括光标在内的后面10个字符
X 大写的X表示删除光标前的一个字符,不包括光标所在字符
nX n表示数字,表示向前删除每个字符,例如:10X表示删除光标前的10个字符,不包括光标所在字符
dd 删除光标所在的行,其实也是剪切
ndd n表示数字,删除光标所在的向下n行
d1G 删除光标所在行到第一行数据
dG 删除光标所在行到最后一行数据
d0 删除光标所在到该行第一个字符
d$ 删除光标所在到该行最后一个字符
yy 复制光标所在的行
nyy n表示数字,复制光标所在的向下n行
y1G 复制光标所在行到第一行数据
yG 复制光标所在行到最后一行数据
y0 复制光标所在到该行第一个字符
y$ 复制光标所在到该行最后一个字符
p 小p表示将已复制的数据粘贴在光标的下一行
P 大P表示将已复制的数据粘贴在光标的上一行
J 将光标所在的行与下一行的数据合并为一行
u 小u表示撤销上一步操作(特别重要,类似于windows里面的word里面的crtl+y)
ctrl+r 与u相反,表示重做前一步操作(特别重要,类似于windows里面的word里面的crtl+y)
. 点,表示重复前一个操作,例:想多次复制,一直按这个点就行了
注:以上删除、复制和粘贴均是在非编辑模式下的操作
语法规则:命令 -选项 参数(命令操作的目录){之间要有空格}
2个特殊的目录:.和..分别代表当前目录和当前目录的父目录
alt+F#从字符界面到其他 ctrl+Alt+F#从图形界面到其他
shutdown -h now(立即关闭)
shutdown -h +5(5分钟后关闭) 系统会播报
shutdown -P +5(5分钟后关闭) P是大写 。小写无效
shutdown -r +5"the system will be power off in 5minutes" (5分钟后关闭,并推送信息到每个用户)
↑所有组
-普通的二进制文件 ↑所有者 ↑ ↑ 4096个文件
d rwx rwx rwx 4 root root 4096
↑ -- -- -- ↑4个硬链接文件
↑ ↑ ↑ ↑rwx统称其他o
↑ ↑ ↑rwx统称所有组g
↑ ↑
↑ ↑ r:读操作,w 写操作,x执行操作 . rwx 统称为所有者u
↑ d代表目录 f二进制文件
以上都可以通过shutdown -c取消
pwd 查看当前工作目录
命令ls 命令所在路径/bin/ls
ls 选项[-ald][文件或目录]
-a显示所有文件,包括隐藏文件
-l详细信息显示
-d查看目录属性
语法规则:cd [目录]
cd .. 返回上级
cd /返回根目录
cd /etc 到etc 目录下
cd 若不指定则切换到$HOME下
touch[文件名] 创建文件
touch a -->删除的话直接用 rm a ,然后y既可
touch -a -t 201610210941 myfile 修改文件的存取时间
touch -m -t 201610210941 myfile 修改文件的修改时间
mkdir [目录名] 创建一个目录。
mkdir dir1 -->删除的话直接用 rm -r dir1 ,然后y既可,若用上面的会无法删除,且xx是一个目录
rm -r[文件或目录] rm即remove
rm a 然后输入y既可删除当前的a文件-->用ls 查看既可发现
rm -r a 也可以 -r是删除目录
rm -rf etc既可强制删除
cp -R[源文件或目录][目的目录] 复制目录
cp file1 file2 dir1 -->将file1 file2复制到dir1目录中
cp /etc/services ./services 复制到当前目录
cp services ser 可以边复制边改名
cp -R /etc ./所有的文件复制到当前目录
mv[源文件或目录][目的目录] 移动
mv ./etc/inittab ./ 把当前目录下的Inittab移动到当前目录下
mv file1 file2 将当前文件名字改为file2
mv file1 newdir 将当前file1移动newdir目录中
如
touch a mkdir newdir mv ./a ./newdir ls cd .. rm -r newdir
cat[文件名] 显示文件信息
如 cat /etc/issue 显示版本信息
cat -n 按行号显示信息
move[文件名] 分页显示文件内容
tail -num[文件名] 查看文件的后几行
tail -10 /etc/services
tail -f /etc/services 动态变化
head -num[文件名] 查看文件的前几行
head -20 /etc/services
如在根目录下: mkdir newdir cd newdir touch a vi a "sdgjhajkltelkwajtkl这里是文本信息" 保存退出
head -1 /newdir/a -->sdgjhajkltelkwajtkl这里是文本信息
ln -s[源文件][目标文件] 产生连接文件 ln link 的缩写
ln -s /etc/issue 软连接文件-->指向源文件 源文件删除的话,软文件也会没有
ln /etc/issue 硬链接文件 为防止源文件被删除, 一般需要被封硬链接文件
(1)chmod[{ugo}{+-=}{rwx}][文件或目录] 改变文件或目录权限 (2){mode=421}[文件或目录]
+是增加权限 -删除权限 =直接赋予权限
如:chmod ugo+rwx file1 赋予文件file1 所有人所属组其他人 读写执行能力
通过ls -l 查看 当前目录里文件的权限
chmod 777 file1 设定file1为所有用户具有全部权限 7 既4+2+1 4是读 2是写 1 是执行
chown [用户][文件或目录] 改变文件或目录的所有者
chown nobody file1 ls -l chown root file1 ls -l
chgrp [用户][文件或目录] 改变文件或目录的所有组
chgrp nobody file1 ls -l
whoami 显示当前的登入用户
umask [选项] [掩码]
umask [-S] s要大写,显示设置文件的缺省权限 权限掩码 022
umask 022
umask 027 //更加安全
022表示默认创建文件权限为755,也就是rwx r-x r-x 。
027表示默认创建文件权限为750,也就是rwx r-x --- 。
ls -ld newdir 看目录的权限
which[命令名称] 文件搜素命令
which ls ls --color 有颜色区分
which rm rm -i询问
find[搜索路径][搜素关键字] 查找文件或目录
find /etc -name init 在目录/etc中查找init文件
find /etc -name init*在目录/etc中查找所有带有init的文件
find /etc -name init???在目录/etc中查找所有带有init的7位文件
通配符 *:0个或多个字符 ?:代表单个字符
find /etc -size +204800 在etc目录下查找大于100m的文件
find /etc -size +163840 -a size -204800 在etc目录下查找大于80m小于100m的文件
-a 是逻辑与 相当于and -o 是逻辑或,相当于或
find /etc -type f 在etc目录下查找二进制类型的文件
find /etc size +163840 -a -type f 在etc 目录下查找大于80m并且是二进制类型的文件
mkdir newdir chown xxx newdir ls -l find / -user xxx 在根目录下查找所有者为xxx的文件
find /etc -ctime -1 在根目录下查找24小时内被修改过的文件
c是change改变文件的属性 如:所有者,所有组,权限。。。
m是modify改变的是文件的内容
a是access访问
以天为单位 ctime,atime,mtime
以分钟为单位 cmin, amin,mmin
find /bin -type f -exec ls -l {} \;
在bin目录下查找二进制文件并显示其内容, 最后是有分号的。
locate [搜素关键字]搜素与关键字相关的所有文件
locate file 列出所有跟file有关的文件 ,若是a ,就列出所有带有a的文件
updatedb更新数据库,与上面是配对的。
grep[指定字串][源文件] 在文件中搜素字串匹配的行并输出
grep ftp /etc/services 列出目录下所有ftp的行
man[命令或配置文件] 获得帮助信息
man ls 查看ls命令的帮助信息
man cd 不能查看,它是内置信息 只能 help cd
date #以默认方式显示当前日期和时间
date -u #传统unix风格选项
通过IO重定向生成文件myf:
ls -l /usr > myf ; ls >> myf
分屏显示文件内容(more/less)
more myf 或 ls -l /myf | less
>或>>输出重定向
<或<输入重定向
> 是定向输出到文件,如果文件不存在,就创建文件;如果文件存在,就将其清空
>>是将输出内容追加到目标文件中。如果文件不存在,就创建文件;如果文件存在,则将新的内容追加到那个文件的末尾,该文件中的原有内容不受影响。
输入输出重定向可以参考: http://www.cnblogs.com/chengmo/archive/2010/10/20/1855805.html
管道:
将一个命令的输出传送给另外一个命令,作为另外一个命令的输入;
例如:ls -l /etc | more
命令连接符
;间隔的命令按顺序依次执行
&&前后命令存在逻辑与关系,只有前面的关系被执行了,后面的关系才能被执行
||前后命令存在逻辑或关系,只有前面的关系执行失败了,后面的关系才能被执行
命令替换符
将以个命令的输出作为另外一个命令的参数
命令1 `命令2` 此处为反引号
ls -l `which touch`
gzip选项[文件] 压缩文件 gzip a
gunzip [文件] 解压文件 gunzip a.gz
tar 选项[cvf][目录] -c产生.tar打包文件 -v显示详细信息 -f指定压缩后的文件名 -z打包同事压缩
mkdir a
打包同时压缩tar -zcvf b.tar.gz a
解包同时解压tar -zxvf b.tar.gz 2者原文件都还在
打包tar -cvf b.tar a
解包tar -xvf b.tar
zip选项[-r][压缩后文件名称][文件或目录]
-r压缩目录
zip services.zip /etc/services 压缩文件
zip -r test.zip/test压缩目录
unzip解压缩
write
write <用户名>
向另外一个用户发送信息 ,ctrl+d作为结束
$write feng
wall
wall [message] [文件名]
向所有用户广播信息
$wall happy new year
ping
ping 选项IP地址
ping 211.67.116.9
Shell变量
变量:是shell传递数据的一种方法,用来代表每个取值的符号名。
Shell有两类变量:临时变量和永久变量。
临时变量是shell程序内部定义的,其使用范围仅限于定义它的程序,对其它程序不可见。包括:用户自定义变量、位置变量。
永久变量是环境变量,其值不随shell脚本的执行结束而消失。
1、用户自定义变量
用户定义的变量由字母或下划线开头,由字母、数字或下划线序列组成,区分大小写。变量名长度没有限制。在使用变量值时,要在变量名前加上前缀“$”。
2、设置和使用变量
设置变量:习惯上用大写字母来命名变量。变量名只能以字母表中的字符开头,不能用数字。
变量赋值:“=”两边没有空格。
定义时赋值,如NUM=1
将一个命令的执行结果赋给变量,如:TIME=`date`;TIME=$(date +%F) //注意date 后面有一个空格
将一个变量的值赋给另一个变量,如:B=120 ; A =$B
使用echo命令查看变量值。例如:echo $A
单引号会原封不动的把变量输出。双引号则输出内容。
删除变量:unset [变量名]
unset time
7. 特殊变量
$@ 相当于数组
$* 这个程序的所有参数
$# 这个程序的参数个数
$$ 这个程序的PID
$! 执行上一个后台命令的PID
$? 执行上一个命令的返回值
#!/bin/sh if [ $# -le 0 ] then echo "not enough " exit 0 fi while [ $# -gt 0 ] do echo "$@" echo "$*" echo "$#" echo "$$" echo "$!" echo "$?" break done
sh b.sh 1 2 3 4 5
输出结果为:1 2 3 4 5
1 2 3 4 5
5
3295
空
0
9. read 命令
read 的例子:
#! /bin/sh
read first second third
echo "the first parameter is $first"
echo "the second parameter is $second”
echo "the third parameter is $third"
expr命令:对整数型变量进行算术运算
语法: expr 表达式 #注意 运算符之间要有空格
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[root@hpc test ] # expr 3 + 5 8 [root@hpc test ] # var1=8 [root@hpc test ] # var2=2 [root@hpc test ] # exp expand exportfs expresskeys export expr [root@hpc test ] # expr $var1 - 5 //expr 后面要有空格 操作符之间也要有空格 3 [root@hpc test ] # expr $var1 / $var2 4 [root@hpc test ] # expr $var1 * $var2 expr : syntax error [root@hpc test ] # expr $var1 \* $var2 //2 个数相乘,需要要转译符\* 16 |
2 expr 程序的例子
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[root@hpc test ] # cat expr.sh #! /bin/sh a=10 b=20 c=30 value1=` expr $a + $b + $c` echo "The value of value1 is $value1" value2=` expr $c / $b` echo "The value of value2 is $value2" value3=` expr $c \* $b` #整除 echo "The value of value3 is $value3" value4=` expr $a + $c / $b` echo "The value of value4 is $value4" |
测试:
1
2
3
4
5
|
[root@hpc test ] # ./expr.sh The value of value1 is 60 The value of value2 is 1 The value of value3 is 600 The value of value4 is 11 |
3 复杂的运算
1
2
3
|
[root@hpc test ] # var4=8 [root@hpc test ] # expr `expr 5 + 11` / $var4 2 |
【例】
1
2
3
4
5
|
[root@hpc test ] # var1=8 [root@hpc test ] # var2=2 [root@hpc test ] # var4=`expr $var1 / $var2` [root@hpc test ] # echo $var4 4 |
//注意反引号
......................................................
#!/bin/sh if [ $a1 -eq $a2 ]; then //要有空格 [ $a1 -eq $a2 ]折是test $a1 -eq $a2的简化 echo "$a1 equals $a2" elif [ $a1 -lt $a2 ]; then echo "$a1 littler than $a2" elif [ $a1 -gt $2 ]; then echo "$a1 greater than $a2" fi
#!/bin/sh echo "what day is it taday" read day case $day in "monday") echo "monday";; //可以用| "tuesday") echo "tuesday";; "wednesday") echo "wednesday";; *) echo "other day";; esac
//上面的while后面少条件的,有错误
格式一
while 条件;
do
语句
done
格式二 死循环
while true
do
语句
done
格式三 死循环
while :
do
语句
done
格式四 死循环
while [ 1 ]
do
语句
done
格式五 死循环
while [ 0 ]
do
语句
done
#!/bin/sh for day in monday tuesday wednesday thursday friday saturday sunday do echo "what day is it taday" read day case $day in "monday"|"tuesday"|"wednesday"|"thursday"|"friday"|"saturday"|"sunday") echo "$day";; *) echo "error day" break;; esac done
shift 指令
#!/bin/sh if [ $# -le 0 ] then echo "not enough " exit 0 fi sun=0 while [ $# -gt 0 ] do echo "$@" shift done
参数左移,每执行一次,参数序列顺
次左移一个位置,$#的值减1,
用于分别处理每个参数,移出去的参数不再可用
until 命令
#!/bin/bash a=0 until [ ! $a -lt 10 ] //不小于10的时候跳出循环 do echo $a a=`expr $a + 1` done
结果:0 1 2 3 4 5 6 7 8 9
16. Shell 脚本调试
sh -x script
这将执行该脚本并显示所有变量的值。
sh -n script
不执行脚本只是检查语法的模式,将返回
所有语法错误。
select变量
select 变量in 关键字
do
n command 1
ü... ...
n command n
done
#!/bin/sh echo "a is 5,b is 3.Please select your method" a=5 b=3 select var in "a+b" "a-b" "a*b" "a/b" do break done case $var in "a+b") echo 'a+b='`expr $a + $b`;; "a-b") echo 'a-b='`expr $a "-" $b`;; "a*b") echo 'a*b='`expr $a "*" $b`;; "a/b") echo 'a/b='`expr $a "/" $b`;; *) echo "input error..." esac
显示的的a+b是select上的。