Linux Shell编程基础
1. Linux 基本命令
ls 显示文件或目录
-l 列出文件详细信息l(list)
-a 列出当前目录下所有文件及目录,包括隐藏的a(all)
mkdir 创建目录
-p 创建目录,若无父目录,则创建p(parent)
cd 切换目录
touch 创建空文件
echo 输出Echo “helloworld” > test.out (>>追加,<覆盖)
cat 查看文件内容
cp 拷贝
mv 移动或重命名
rm 删除文件
-r 递归删除,可删除子目录及文件
-f 强制删除
find 在文件系统中搜索某文件
wc 统计文本中行数、字数、字符数 wc [选项] 文件
grep 在文本文件中查找某个字符串 grep ‘字符串’ 文件名
rmdir 移除指定目录 –p 若删除目录后父目录变为空则一块删除
tree 树形结构显示目录,需要安装tree包
pwd 显示当前目录
ln 创建链接文件
more、less 分页显示文本文件内容 more只能向后,less可以向前翻页
head、tail 显示文件头、尾内容 head –行数 文件名
ctrl+alt+F1 命令行全屏模式
stat 显示指定文件的详细信息,比ls更详细
who 显示在线登陆用户
whoami 显示当前操作用户
hostname 显示主机名
uname 显示系统信息
top 动态显示当前耗费资源最多进程信息
ps 显示瞬间进程状态 ps –aux ps -ef
du 查看目录大小 du -h /home带有单位显示目录信息
df 查看磁盘大小 df -h 带有单位显示磁盘信息
ifconfig 查看网络情况
ping 测试网络连通
netstat 显示网络状态信息
man 命令不会用了,找男人 如:man ls
clear 清屏
alias 对命令重命名 如:aliasshowmeit="ps -aux" ,另外解除使用unaliaxshowmeit
kill 杀死进程,可以先用ps 或 top命令查看进程的id,然后再用kill命令杀死进程。
gzip:
bzip2:
tar: 打包压缩
-c 归档文件
-x 压缩文件
-z gzip压缩文件
-j bzip2压缩文件
-v 显示压缩或解压缩过程 v(view)
-f 使用档名
例:
tar -cvf/home/abc.tar /home/abc 只打包,不压缩
tar -zcvf/home/abc.tar.gz /home/abc 打包,并用gzip压缩
tar -jcvf/home/abc.tar.bz2 /home/abc 打包,并用bzip2压缩
当然,如果想解压缩,就直接替换上面的命令 tar-cvf / tar -zcvf / tar -jcvf 中的“c” 换成“x” 就可以了。
shutdown
-r 关机重启
-h 关机不重启
now 立刻关机
halt 关机
reboot 重启
将一个命令的标准输出作为另一个命令的标准输入。也就是把几个命令组合起来使用,后一个命令除以前一个命令的结果。
例:grep -r "close" /home/* |more 在home目录下所有文件中查找,包括close的文件,并分页输出。
dpkg (Debian Package)管理工具,软件包名以.deb后缀。这种方法适合系统不能联网的情况下。
比如安装tree命令的安装包,先将tree.deb传到Linux系统中。再使用如下命令安装。
sudo dpkg -itree_1.5.3-1_i386.deb 安装软件
sudo dpkg -rtree 卸载软件
注:将tree.deb传到Linux系统中,有多种方式。VMwareTool,使用挂载方式;使用winSCP工具等;
APT(AdvancedPackaging Tool)高级软件工具。这种方法适合系统能够连接互联网的情况。
依然以tree为例
sudo apt-getinstall tree 安装tree
sudo apt-getremove tree 卸载tree
sudo apt-getupdate 更新软件
sudo apt-getupgrade
将.rpm文件转为.deb文件
.rpm为RedHat使用的软件格式。在Ubuntu下不能直接使用,所以需要转换一下。
sudo alienabc.rpm
vim三种模式:命令模式、插入模式、编辑模式。使用ESC或i或:来切换模式。
命令模式下:
:q 退出
:q! 强制退出
:wq 保存并退出
:set number 显示行号
:set nonumber 隐藏行号
/apache 在文档中查找apache 按n跳到下一个,shift+n上一个
yyp 复制光标所在行,并粘贴
h(左移一个字符←)、j(下一行↓)、k(上一行↑)、l(右移一个字符→)
/etc/passwd 存储用户账号
/etc/group 存储组账号
/etc/shadow 存储用户账号的密码
/etc/gshadow 存储用户组账号的密码
useradd 用户名
userdel 用户名
adduser 用户名
groupadd 组名
groupdel 组名
passwd root 给root设置密码
su root
su -root
/etc/profile 系统环境变量
bash_profile 用户环境变量
.bashrc 用户环境变量
su user 切换用户,加载配置文件.bashrc
su - user 切换用户,加载配置文件/etc/profile ,加载bash_profile
更改文件的用户及用户组
sudo chown [-R]owner[:group] {File|Directory}
例如:还以jdk-7u21-linux-i586.tar.gz为例。属于用户hadoop,组hadoop
要想切换此文件所属的用户及组。可以使用命令。
sudo chownroot:root jdk-7u21-linux-i586.tar.gz
三种基本权限
R 读 数值表示为4
W 写 数值表示为2
X 可执行 数值表示为1
如:jdk-7u21-linux-i586.tar.gz文件的权限为-rw-rw-r--
-rw-rw-r--一共十个字符,分成四段。
第一个字符“-”表示普通文件;这个位置还可能会出现“l”链接;“d”表示目录
第二三四个字符“rw-”表示当前所属用户的权限。 所以用数值表示为4+2=6
第五六七个字符“rw-”表示当前所属组的权限。 所以用数值表示为4+2=6
第八九十个字符“r--”表示其他用户权限。 所以用数值表示为2
所以操作此文件的权限用数值表示为662
更改权限
sudo chmod [u所属用户 g所属组 o其他用户 a所有用户] [+增加权限 -减少权限] [r w x] 目录名
例如:有一个文件filename,权限为“-rw-r----x” ,将权限值改为"-rwxrw-r-x",用数值表示为765
sudo chmod u+xg+w o+r filename
上面的例子可以用数值表示
sudo chmod 765filename
2. 管道,重定向和 backtick
管道 (|) 将一个命令的输出作为另外一个命令的输入。
grep"hello" file.txt | wc -l
在file.txt中搜索包含有”hello”的行并计算其行数。
在这里grep命令的输出作为wc命令的输入。当然您可以使用多个命令。
重定向:将命令的结果输出到文件,而不是标准输出(屏幕)。
ps -ef |grep java
> 写入文件并覆盖旧文件
>> 加到文件的尾部,保留旧文件内容。
反短斜线
使用反短斜线("`")可以将一个命令的输出作为另外一个命令的一个命令行参数。
find . -mtime -1-type f -print
用来查找过去24小时(-mtime –2则表示过去48小时)内修改过的文件。如果您
想将所有查找到的文件打一个包,则可以使用以下脚本:
#!/bin/sh
# The ticks arebackticks (`) not normal quotes ('):
tar -zcvflastmod.tar.gz `find . -mtime -1 -type f -print`
Test 检查文件和比较值 等于表达式[]
1)判断表达式
if test (表达式为真)
if test !表达式为假
test 表达式1 –a 表达式2 两个表达式都为真
test 表达式1 –o 表达式2 两个表达式有一个为真
2)判断字符串
test –n 字符串 字符串的长度非零
test –z 字符串 字符串的长度为零
test 字符串1=字符串2 字符串相等
test 字符串1!=字符串2 字符串不等
3)判断整数
test 整数1 –eq 整数2 整数相等
test 整数1 –ge 整数2 整数1大于等于整数2
test 整数1 –gt 整数2 整数1大于整数2
test 整数1 –le 整数2 整数1小于等于整数2
test 整数1 –lt 整数2 整数1小于整数2
test 整数1 –ne 整数2 整数1不等于整数2
4)判断文件
test File1–ef File2 两个文件具有同样的设备号和i结点号
test File1–nt File2 文件1比文件2 新
test File1–ot File2 文件1比文件2 旧
test –bFile 文件存在并且是块设备文件
test –cFile 文件存在并且是字符设备文件
test –d File 文件存在并且是目录
test –eFile 文件存在
test –fFile 文件存在并且是正规文件
test –gFile 文件存在并且是设置了组ID
test –GFile 文件存在并且属于有效组ID
test –hFile 文件存在并且是一个符号链接(同-L)
test –kFile 文件存在并且设置了sticky位
test –bFile 文件存在并且是块设备文件
test –LFile 文件存在并且是一个符号链接(同-h)
test –oFile 文件存在并且属于有效用户ID
test –pFile 文件存在并且是一个命名管道
test –rFile 文件存在并且可读
test –sFile 文件存在并且是一个套接字
test –tFD 文件描述符是在一个终端打开的
test –uFile 文件存在并且设置了它的set-user-id位
test –wFile 文件存在并且可写
test –xFile 文件存在并且可执行
3. 流程控制
If else:
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
For
for var in item1item2 ... itemN
do
command1
command2
...
commandN
done
While
while condition
do
command
done
until
until condition
do
command
done
Case
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
Vim中文乱码
修改当前:
set encoding=utf-8 termencoding=gbk fileencoding=utf-8
永久修改:
修改文件/etc/vimrc 或者在~/.vimrc
set fileencodings=utf-8,gb2312,gbk,gb18030
set termencoding=utf-8
set fileformats=unix
set encoding=prc
4. 函数
定义格式:
[ function ] funname [()]
{
action;
[return int;]
}
funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"
$# | 传递到脚本的参数个数 |
$* | 以一个单字符串显示所有向脚本传递的参数 |
$$ | 脚本运行的当前进程ID号 |
$! | 后台运行的最后一个进程的ID号 |
$@ | 与$*相同,但是使用时加引号,并在引号中返回每个参数 |
$- | 显示Shell使用的当前选项,与set命令功能相同。 |
$? | 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。 |