linux学习:特殊符号,数学运算,图像与数组与部分终端命令用法整理
指令:let、expr、array、convert、tput、date、read、md5、ln、apt、系统信息
一:特殊符号用法整理
系统变量
$# 是传给脚本的参数个数
$
0
是脚本本身的名字
$
1
是传递给该shell脚本的第一个参数
$
2
是传递给该shell脚本的第二个参数
$@ 是传给脚本的所有参数的列表
$* 是以一个单字符串显示所有向脚本传递的参数,与位置变量不同,参数可超过
9
个
$$ 是脚本运行的当前进程ID号
$? 是显示最后命令的退出状态,
0
表示没有错误,其他表示有错误
算术比较(比较数字)
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-ge 大于或等于
-le 小于或等于
-a 逻辑与 and &&
-o 逻辑或 or ||
if [ $var -eq 0 ] #当$var等于0时,返回真
if [ $var -ne 0 ] #当$var为非0时,返回真
if [ $var1 -ne 0 -a $var2 -gt 2 ]
if [ $var1 -ne 0 -o $var2 -gt 2 ]
字符串比较(注意,数字当作字符串比较,需要加上引号 例如 "$num" == "12" )
if [[ $str1 = $str2 ]] #当str1等于str2时,返回真。注意:=号前后各有一个空格,如果忘记加空格,则当成赋值处理
if [[ $str1 == $str2 ]]
if [[ $str1 != $str2 ]]
if [[ $str1 > $str2 ]]
if [[ $str1 < $str2 ]]
if [[ -z $str1 ]] #如果str1包含的是空字符串,则返回真。
if [[ -n $str1 ]] #如果str1包含的是非空字符串,则返回真。
文件系统相关条件标志
if [ -f $file ] #如果给定的变量名包含正常的文件路劲或文件名,则返回真。
if [ -x $file ] #如果给定的变量包含的文件可执行,则返回真。
if [ -d $file ] #如果给定的变量包含的是目录,则返回真。
if [ -e $file ] #如果给定的变量包含的文件存在,则返回真。
if [ -c $file ] #如果给定的变量包含的是一个字符设备文件的路劲,则返回真。
if [ -b $file ] #如果给定的变量包含的是一个块设备文件的路劲,则返回真。
if [ -w $file ] #如果给定的变量包含的文件可写,则返回真。
if [ -r $file ] #如果给定的变量包含的文件可读,则返回真。
if [ -L $file ] #如果给定的变量包含的是一个符号链接,则返回真。
if [ -s $file ] #如果文件长度不为0,则为真
if [ -h $file ] # 如果文件是软链接,则为真
if [ $file1 -nt $file2 ] #如果 file1比 file2新,则为真。
if [ $file1 -ot $file2 ] #如果 file1比 file2旧,则为真。
if [ -n $string ] 如果string 非空(非0),返回0(true)
if [ -z $string ] 如果string 为空,则为真
if [ $sting ] 如果string 非空,返回0 (和-n类似)
if [ ! -d $num ] 如果不存在目录$num
if [ 表达式1 –a 表达式2 ] #逻辑与
if [ 表达式1 –o 表达式2 ] #逻辑或
----------------------------------
fpath="/etc/passwd"
if [ -e $fpath ]; then
echo File exists;
else
echo Dones not exist;
fi
----------------------------------
重定向符号 ">" 和">>"
echo "This is a sample text 1" > temp.txt #输出重定向到文件并清空文件原本的内容
echo "This is a sample text 2" >> temp.txt #输出重定向到文件不清空文件原本的内容
pwe >> temp.txt
Shell重定向介绍:
0表示标准输入
1表示标准输出
2表示标准错误输出
> 默认为标准输出重定向,与 1> 相同
2>&1 意思是把 标准错误输出 重定向到 标准输出.
&>file 意思是把 标准输出 和 标准错误输出 都重定向到文件file中
注意:
&>file或n>&m均是一个独立的重定向符号,不要分开来理解。
明确文件和文件描述符的区别。对于&1更准确的说应该是文件描述符1,而1标识标准输出,stdout。对于2,表示标准错误,stderr。
2>&1 的意思就是将标准错误重定向到标准输出。这里标准输出已经重定向到了 /dev/null。那么标准错误也会输出到/dev/null
这里的/dev/null是一个文件,这个文件比较特殊,所有传给它的东西它都丢弃掉。
&>file表示重定向标准输出和错误到文件
n>&m表示使文件描述符n成为输出文件描述符m的副本。不需要错误信息时:2>/dev/null,作用是不显示标准错误输出;需要错误信息时:2>&1,显示错误信息。
例子:
在crontab任务中经常可以看到:
*/2 * * * * root php /www/mysite/index.php task >/dev/null 2>&1
将标准输出重定向到/dev/null,然后再将标准输出重定向到标准输出(结果也是到了/dev/null)。
二:数学运算,图像与数组
常规方式 (())
echo $((2**3)) #求2的3次方
tmp=$((2**3)) #表达式的值赋给变量
echo $((1+3+5)) #求和
bc 计算器
参数控制变量
scale 指定精度,也即小数点后的位数;默认为 0,也即不使用小数部分。示例:scale=5,设置精度为小数点后5位
ibase 指定输入的数字的进制,默认为十进制。示例:ibase=2,设置输入的数字为二进制
obase 指定输出的数字的进制,默认为十进制。示例:obase=8,设置计算结果输出为八进制
echo "(8+2)/3" | bc #sacle变量没有设置,取整数,结果为3
echo "a=10;a/3" | bc #同上
echo "scale=2;a=10;a/3" | bc #scale设置保留2位小数,结果:3.33
echo "ibase=8;obase=2;a=10;a" | bc #将八进制10转换成二进制 结果:1000
tmp=$(echo "1+2+3*5" | bc) #将计算结果赋给tmp,echo $tmp 结果魏:18
let 直接执行基本的算数操作
let result=nol+nol2
let no1++
let no1--
类似
result=$[ no1 + no2 ]
result=$[ $no1 + 5 ]
result=$(( no1 + 50 ))
expr 用于基本算数运算操作
result=`expr 3 + 4`
result=$(expr $no1 +5)
bc 支持浮点数的高级数学运算工具
echo "4 * 0.56" | bc
------------------------------
int=1
while [ $int -le 5 ]
do
i=`expr $i + 1`
echo $i;
done
------------------------------
no=54;
result=`echo "$no * 1.5" | bc`
echo $result
------------------------------
数组
array_var=(1 2 3 4 5 6) #定义数组
array_var[6]=7;
echo ${array_var[6]} #7
-----------------------------
index=5
echo ${array_var[$index]} #6
-----------------------------
echo ${array_var[*]} #1234567 打印所有值
echo ${array_var[@]} #1234567
echo ${#array_var[*]} #7 打印数组元素个数
--------------------------------------------------
declare -A ass_array #单独将变量名声明为关联数组
ass_array=([index1]=var1 [index2]=var2)
ass_array[index3]=var3;
ass_array[index4]=var4;
--------------------------------------------------
echo ${!ass_array[*]} #获取数组的索引列表
echo ${!ass_array[@]} #同上
图像相关
要使用convert需要iamgemagick支持。sudo apt-get install imagemagick
convert image.png image.jpg #将一种图像格式转换为另一种图像格式
convert image.png -resize 1024x768 image.png #改变WIDTHxHEIGHT调整图像大小,WIDTH和HEIGHT必须至少提供一个
convert image.png -resize 1024x image.png #提供了WIDTH,自动按照图像比例缩放
convert image.png -resize "50%" image.png #使用百分比缩放图像
for i in *; do mencoder -oac mp3lame -lameopts vbr=3 -ovcxvid -xvidencopts fixed_quant=4 -of avi $i -o `echo $i | sed -e's/rmvb$/avi/'`; done #批量将rmvb转为avi
for i in *; do convert -resize 30%x30% $1 sm-$1; done #批量缩小图片到30%
for i in *; do convert $i `echo $i | sed -e 's/jpg$/png/'`; done #批量转换jpg到png
for i in *; do inkscape $i –export-png=`echo $i | sed -e 's/svg$/png/'`; done #批量将svg转为png
find . -name *.jpg -exec wc -c {} \; | awk '{print $1}'|awk '{a+=$1}END{print a}' #统计当前目录下所有jpg文件的尺寸
identify -verbose xxx.jpg #去掉文件中的^M
cat filename | tr -d "^M" > newfile #获取jpg的扩展信息(Exif)
sudo apt-get install abcde;abcde -o mp3 -b #CD 抓轨为 mp3 (有损)
sudo apt-get install abcde;abcde -o flac -b #CD 抓轨为 Flac (无损)
三:部分终端命令用法整理
生成字符串的md5密文,-n参数表示不加上换行符,否则可能造成密文不一致。
echo -n "123456" | md5sum
符号链接
ln -s [源文件或目录] [目标文件或目录]
-b 删除,覆盖以前建立的链接
-d 允许超级用户制作目录的硬链接
-f 强制执行
-i 交互模式,文件存在则提示用户是否覆盖
-n 把符号链接视为一般目录
-s 软链接(符号链接)
-v 显示详细的处理过程
ln -s /usr/share/nginx/sbin/nginx /sbin/nginx #创建/sbin/nginx 镜像,链接到/usr/share/nginx/sbin/nginx 要删除该软链接,只需 rm /sbin/nginx 即可
ln –snf [新的源文件或目录] [目标文件或目录] #修改软链接
软链接只要删掉了源链接,软链接也就失效了
终端信息
tput cols #获取终端列数
tput lines #获取终端行数
tput longname #获取终端名
tput bold #设置文本样式为粗体
tput setb no #设置终端背景色 no为0到7
tput setf no #设置终端前景色
tput cup 100 100 #定位光标
日期时间
date #打印纪元时
date +%s #打印此时的时间戳
date -s mm/dd/yy #设置日期
date -s HH:MM #设置时间
date +%Y-%m-%d #日期格式:2012-12-24
date +"%F" #同上
date +%Y-%m-%d –date ‘-1 day' #格式:2012-12-23
date +%Y-m-%d –date ‘Dec 25' #格式:2011-12-25
date +%Y-m-%d –date ‘Dec 25 – 10 days' #格式:2011-12-15
date +"%Y%m%d" -d "+n days" #今天的后n天日期
2017
-
07
-
18
05
:
17
:
01
cal #显示日历
hwclock –systohc #将时间写入CMOS
hwclock –show #查看CMOS时间
hwclock –hctosys #读取CMOS时间
sudo ntpdate ntp.ubuntu.com #从服务器上同步时间
sudo cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime #设置电脑的时区为上海
sudo sed -ie ’s/UTC=yes/UTC=no/g’ /etc/default/rcS;sudo hwclock –systohc #关闭UTC,将当前时间写入CMOS
开关机
sudo halt #命令关机
sudo shutdown -h now #现在关机
sudo shutdown -h 23:00 #晚上11点自动关机
sudo shutdown -h +60 #60分钟后关机
sudo reboot #命令重启电脑
sudo shutdown -r now #现在重启电脑
synclient touchpadoff=1 #关闭笔记本的触摸板
synclient touchpadoff=0 #开启笔记本的触摸板
系统信息
which ls #输出作为参数的命令的所在位置
whereis ls #输出作为参数的命令所在的位置和该命令手册的位置及源码的路劲
whatis ls #输出作为参数的命令的简短的描述信息,这些信息来之该命令的手册
hostname #输出系统的主机名
uname -n #同上
uname -a #打印Linux的内核版本、硬件架构等详细信息
uname -r #打印内核发行版本
uname -m #打印主机类型
cat /proc/cpuinfo #打印cpu相关信息
cat /proc/meminfo #打印内存的详细信息
cat /proc/meminfo | head -l #打印系统可用内存总量
cat /proc/partitions #列出系统的分区信息
cat /proc/5346/status #查看PID为5346的进程的信息
cat /proc/cpuinfo | head -n 5 | tail -l #打印处理器名称
fdisk -l #同上
lshw #获取系统的详细信息
lsmod #查看内核加载的模块
lspci #查看PCI设备
lsusb -v #查看USB设备
sudo lshw #显示当前硬件信息
sudo fdisk -l #查看硬盘的分区
sudo fdisk /dev/sda #硬盘分区
sudo iostat -x 2 #查看硬盘当前读写情况
sudo mkfs.ext3 /dev/sda1 #硬盘格式化
ulimit -n 4096 或 echo 4096 > /proc/sys/fs/file-max #增加系统最大打开文件个数
sleep 3 #延迟3秒再往下执行
more file #分页查看文件内容
less file #可控分页查看文件内容
sudo vim /etc/motd #修改系统登录信息
logger LOG_MESSAGE #向syslog中记录日志信息
alias install='sudo apt-get install' #别名:使用install来代替sudo apt-get install命令
export http_proxy=http://xx.xx.xx.xx:xxx #终端设置代理
zenity --info --text "This is a message" #用zenity创建一个信息框,上面显示文本“This is a message”
convmv -r -f cp936 -t utf8 –notest –nosmart * #转换文件名由GBK为UTF8
iconv -f gbk -t utf8 $i > newfile #转换文件内容由GBK到UTF8
sudo apt-get install python-mutagen;find . -iname ‘*.mp3′ -execdir mid3iconv -e GBK {} \; #转换 mp3 标签编码
录制与回放终端会话
------------------------------------------------------------
script -t 2> timing.log -a output.session #开始录制终端会话
type commands; #要录制的会话命令
...
..
exit #结束录制
scriptreplay timing.log output.session #播放命令序列输出
------------------------------------------------------------
打开两个终端:T1和T2
在T1中输入命令:mkfifo scriptfifo
在T2中输入命令:cat scriptfifo
返回T1,输入:script -f scriptfifo
要接受会话的话就输入exit
------------------------------------------------------------
读取终端输入:read
read -n 5 var #从输入中读取5个字符并存入变量var
read -s var #用不回显的方式读取输入到变量var
read -p "Enter input:" var #显示提示信息
read -t 5 var #读取5秒内的输入到变量var
read -d ":" var #用界定符“:”结束输入行
echo $var
--------------------------------------
输入密码时不显示:
#!/bin/sh
echo -e "Enter password:"
stty -echo
read password
stty echo
echo
echo Password read.
--------------------------------------
环回文件与挂载
dd if=dev/zero of=loopbackfile.img bs=1G count=1 #创建一个环回文件,大小为1GB
mkfs.ext4 loopbackfile.img #将文件格式化为ext4文件系统
sudo file loopbackfile.img #检查文件系统
mount -o loop loopback.img /mnt/loopback #将环回文件挂载到/mnt/loopback目录上(-o loop 用来挂载环回文件系统)
losetup /dev/loop1 loopback.img #(1)
mount /dev/loop1 /mnt/loopback #(2)将loopback.img 挂载到目录/mnt/loopback,这个环回文件连接到一个名为/dev/loop1的设备上
losetup -o 32256 /dev/loop2 loopback.img #在lookback.img中创建分区并挂载第一个分区,-o表示偏移量。第一个分区自硬盘第32256字节之后起始的。
sudo umount /mnt/sda1 #卸载
快速定位
pushd /var/www #将该目录压进栈,并切换到该目录
pushd /usr/src #同上
dirs #查看栈中的元素
pushd +2 #切换到栈中第3个元素存放的目录
popd +2 #移除栈中第3个元素存放的目录
软件包相关
apt search sqlite3 #查找包含sqlite3字样的软件包
aptitude search pakege #查找软件库pakege中的软件
dpkg -S filename #查找文件属于哪个包
dpkg -L xxx #查看软件xxx安装内容
apt-cache search partitions #使用正则表达式partitions查找软件库中的软件
apt-file search filename #查找文件属于哪个包
apt-cache depends xxx #查询软件xxx依赖哪些包
apt-cache rdepends xxx #查询软件xxx被哪些包依赖
apt-cache show k3b #显示包的信息
apt-cache pkgnames #显示系统全部可用包的名称
apt-cache stats #显示系统安装包的统计信息
sudo apt-cdrom add #增加一个光盘源
sudo apt-get autoclean #清理旧版本的软件缓存
sudo apt-get update
sudo apt-get dist-upgrade #系统升级
sudo apt-get autoremove #删除系统不再使用的孤立软件
lsb_release -a 或 cat /etc/issue #查看Ubuntu版本
dpkg -l |grep ^rc|awk ‘{print $2}’ |sudo xargs dpkg -P #清除已删除包的残馀配置文件
export GIT_SSL_NO_VERIFY=1 #系统不信任github网站时执行
设备:
linux 设备里面有个比较特殊的文件:
/dev/[tcp|upd]/host/port 只要读取或者写入这个文件,相当于系统会尝试连接host这台机器,对应port端口。如果主机以及端口存在,就建立一个socket连接。将在/proc/self/fd目录下面,有对应的文件出现。
1.以读写方式打开/dev/tcp,并指定服务器名为:www.baidu.com,端口号为:80,指定描述符为8。(要注意的是:/dev/tcp本身是不存在的):
exec 8<>/dev/tcp/www.baidu.com/80
此时查看/proc/self/fd/或者/dev/fd/目录下会有8这个描述符(socket连接)生成。
2. 向文件(socket连接)中随便写一些数据:
echo -e "GET">&8
3. 读取返回的信息并打印到终端(一般读取完后自动关闭该链接):
cat<&8
4.手动关闭连接
exec 8>&-