Linux下shell的学习--之杂七杂八

来源:互联网 发布:淘宝网页制作模板 编辑:程序博客网 时间:2024/06/09 00:15
#!/bin/bash
#终端打印
echo 'HELLOWORLD!'                    #理解echo是否带有引号、单引号、双引号区别
echo "1\t2\t3"   #echo默认会自动加一个回车,加-n可忽略
echo -e "1\t2\t3"   #-e代表使用转义序列
printf "%-5s %-10.2f\n" aaa 12.3456   #-5代表左对齐,默认右对齐 .2指定保留2个小数位
var=15
echo val的值为:$var,长度为:${#var}
#echo $0 $SHELL
if [ $UID -ne 0 ]; then 
echo current user not root
fi   #if判断是否是超管,超管UID为0
#通过shell进行数学运算
no1=4
no2=5
echo $no1+$no2     
let result=no1+no2    #let命令可以直接执行基本算数操作
echo $result
let no1++             #自加
let no2+=1            #简写
echo $no1 $no2
echo $[ no1 + no2 ]
echo "scale=2;sqrt(4*$no1)" | bc   #bc数学运算的工具,scale=2将小数位个数设置为2
#文件描述符
echo "I am a boy!" >> aaa.bcp        #重定向到文件,追加
echo "I am a boy!" > aaa.bcp         #重定向到文件,先清空
ls + 2>> aaa.bcp                     #错误信息重定向到文件中
cmd 2>> bbb.bcp 1>>aaa.bcp           #错误信息重定向到一个文件,输出执行内容定向到另一个文件
cat aaa.bcp | tee aab.bcp | cat -n  #tee-写入文件,数据副本作为后续命令的stdin.tee -a 追加,默认覆盖.cat -n 为每行加行号
#数组:普通数组和关联数组--普通数组只能用整数做为数组索引,关联数组从Bash4.0版本开始支持
#定义普通数组方式--1、在单行中定义一列值来定义数组
array_var=(1 2 3)
#定义普通数组方式--2、索引-值 
array_var[3]="ccc"     
echo ${array_var[0]}   
echo ${array_var[3]}
echo 数组的值为:${array_var[*]}  数组长度为:${#array_var[@]}
#定义关联数组需要显示声明
declare -A ass_array
#定义关联数组方式--1、利用内嵌索引-值
ass_array=([apple]=5.3 [orange]=6.2)
#定义关联数组方式--2、使用独立的索引-值
ass_array[peach]=7.9
echo apple:${ass_array[apple]}
echo 关联数组索引列表为:${!ass_array[@]}  数组值为:${ass_array[@]}
#时间
echo $date
echo $(date --date "20151211" +%s)  #时间戳
echo $(date  +%Y%m%d%H%M%S)
#示例1
echo -n Count:
tput sc              #保存当前光标位置
count=0
while true
do
if [ $count -lt 3 ];
then let count++
#sleep 休眠1秒
sleep 1
tput rc             #恢复光标到最后保存位置
tput el             #清除到行尾
#执行时显示参数和命令
#set -x
echo -n $count
#禁止调试
#set +x
else 
echo -e " "
break
fi
done
#示例2---调试
function DEBUG()
{
[ "$_DEBUG" == "on" ] && $@ || :
}
for i in {1..6}  #从1-6
do
DEBUG echo $i
done
#命令序列输出到屏幕--1
cmd_output=$(ls | cat -n)
echo $cmd_output
#命令序列输出到屏幕--2
cmd_output=`ls | cat -n`
echo $cmd_output
#read -p "Enter input:" -s -n 2 var   #-n读取n个字符 -s不回显 -p提示信息 
#read -p "Enter input:" -s -t 5 -d ":" var      #-t超时时间  -d 定界符 
#echo -e "$var"
#if..else..
if [ 2 -lt 1 ];
then
echo "2<1"
elif [ 2 -lt 2 ];
then
    echo "2<2"
else
    echo "2>=2"
fi
[ 1 -gt 0 -a 2 -ge 2 ] && echo "1>0&&2>=2";     #&& 条件真,执行  -a-与   或者两个语句之间 用&&
[ 1 -lt 2 -o 4 -ne 4 ] || echo "1<2&&4!=4";     #|| 条件假,执行  -o-或    或者两个语句之间 用||
[ -f "/mnt" ] && echo "/mnt存在"            # -f:给定的变量名包含正常的文件路径或文件名,返回真
[ -x "/mntt" ] && echo "/mntt可执行"        #-x:给定的变量名包含文件可执行,返回真
[ -d "/mntt" ] && echo "/mntt目录存在"      #-d:给定的变量名包含的是目录,返回真
[ -e "/mntt" ] && echo "/mntt文件存在"      #-e:给定的变量名包含的文件存在,返回真
[ -r "/mntt" ] && echo "/mntt可读"         #-r:给定的变量名包含的文件可读,返回真  -w 可写
[[ "aaa" > "bbb" ]] && echo "aaa>bbb"     #字符串比较时最好用双中括号 = == != > < 且符号前后各有一个空格
[[ -z "" ]] && echo "空字符"               # -z  空字符
[[ -n "" ]] && echo "空字符"   # -n 非空字符
if test "a" = "b" ; then echo "a=b";fi   #test 用于执行条件检测,替代[]
file_jpg="sample.jpg"
name=${file_jpg%.*}          # %从右先坐找删除%后的通配符匹配的字符串,非贪婪, %%贪婪
extension=${file_jpg#*.}                  #  #从左向右找删除#后的通配符匹配的字符串,非贪婪, ##贪婪
echo 文件名为:$name  后缀名为: $extension
dd if=/dev/zero of=junk.bcp bs=1M count=2 #创建1M * 2大小的文件  /dev/zero 是个字符设备,返回0字节
rm -rf junk.bcp
grep -n -i -e "Boy" -e "a" aaa.bcp --color=auto                     #-n 打印行数  -i 忽略大小写       
echo I am a boy | grep -b -o -E "[a-z]+"               #-E  正则   -o 只输出匹配的部分 -b偏移
echo -e "1 2 3 \nhell\n5 6" | egrep -c "[0-9]" #-c  匹配字符串的行数
echo -e "1 2 3 \nhell\n5 6" | egrep -o "[0-9]" |wc -l  #匹配单词的个数
echo -e "aaaaabbbbb" | grep -e "aaa" -e "bbb" #-i 忽略大小写,-e 指定多个表达式
#-r 递归   --include 搜索指定文件  *.{idx,bcp}={*.idx *.bcp}  --exclude  排除
grep "mode" . -r --include *.{idx,bcp}
echo -e "1\n2\n3\n4\n5\n6\n7" > grep.bcp
grep -A 2 "4" grep.bcp #-A 匹配文本行及之后的n行
grep -B 2 "4" grep.bcp #-B 匹配文本行及之前的n行
grep -C 2 "4" grep.bcp #-C 匹配文本行及之前和之后的n行
rm -rf grep.bcp
grep -q "boys" aaa.bcp                        #静默输出,不在向标准输出打印东西,只是返回退出状态
if [ $? -eq 0 ]; then
echo "boy is in aaa.bcp"
else
echo "boy is not in aaa.bcp"
fi
echo "0-$0 1-$1 2-$2"
echo -e "1\t2\t3" > cut.bcp
cut -f 2,3 cut.bcp
cut -f 1 --complement cut.bcp
cut -f 2 -d " " cut.bcp
sed -i 's/3/Boy/g' cut.bcp #-i 替换结果应用于源文件->只是替换没一行中第一处 g替换全部
sed 's/2/5/;s/1/6/' cut.bcp #多个sed 用;   也可sed a | sed b
cat cut.bcp
#NR:执行过程中当前行数,NF:当前行的字段数,$0第一列
echo -e "1 2 3\na b c\nA B C" | \
awk 'BEGIN{ print "START" } { print $0 $1 $2"-->fieldnum:"NF} END{ print "END";print "all_lines:"NR}'
ls -l | awk '{ print $4":"$9}'
#外部变量传递给awk
var1=1;var2=2
awk '{print v1 v2}' v1=$var1 v2=$var2 cut.bcp
#-F 指定定界符
awk -F '\t' '{ print $NF }' cut.bcp
#迭代单词中每个字符, ${string:start_pos:No_of_characters}
word="abcdefg"
for ((i=0;i<${#word};i++))
do
echo -n -e "${word:i:1}\t"
done
echo
#while循环读文件内容
while read line
do 
echo $line
done < cut.bcp
#shift 3 将参数左移3个 $4-->$1 $5-->$2,原值丢弃  
while true;do
    [ $# -eq 0 ] && break
    echo "$1--->$#"
    shift

done

#case的应用
case $1 in 
    a) echo aaa;;
    b) echo bbb;;
    *) echo ccc
esac

rm -rf aaa.bcp aab.bcp bbb.bcp cut.bcp

1 0
原创粉丝点击