1. 程式人生 > >shell 相關知識(1)

shell 相關知識(1)

shell


shell自己的能力
寫腳本還行,起碼現在現網上跑的自己寫的腳本
程序-日誌的 定時備份和刪除,nfs上海量文件刪除和發送郵件。



【data】
export PATH=/mall/jdk/jdk1.7/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
export LANG=zh_CN.GB18030

start=`date +%s -d "2011-11-28 15:55:37"`
end=`date +%s -d "2011-11-28 15:55:52"`
echo $(($end-$start))
date "+%Y-%m-%d %H:%M:%S"

date -d ‘+1 day‘ +"%d" 本日+1
date -s 20100405
date -s 14:31:00

1、上個月末
date -d `date +%y%m01`"-1 day" +%d
2、往前倒
date -d -`date +%d`day +%d
3、條件
if [`date +%d -d tomorrow` == 01 ];
4、上個月
date -d last-month
date -d -1month
date -d ‘-1 month‘ +"%m"
5、下個月
date -d next-month
date -d 1month
6、本月初
date -d 1`date +%B`
上個月初
date -d 1`date -d last-month +%B`

指定月份
day -d 1May

echo `date +%d` | xargs -I{} date -d ‘-{} day‘ +%Y%m%d Linux如何得到上月月末日期


sed -i "3s/.*/$table/g" conf/run.sql
table=t_sms_mt_log_`date +"%m"` 本月,然後月初1號還是統計上月
date -d ‘-1 day‘ +"%m" 本月,實實在在的本月
subject="每日驗證碼下發數量統計_`date -d ‘-1 day‘ +"%m%d"`"

select * from t_sys_user where user_code=‘duanzz‘;

update t_sys_user set terminal_id=‘13730000000‘ where user_code=‘duanzz‘;


set fileformat=unix

字符串的截取-替換
echo ${stringa:1} 從第二位一直往後所有
echo ${stringa:2:5} 從第三位往後一共截取5位

echo ${stringZ:(-4)} 從右到左開始截取
echo ${stringZ: -4} 從右到左開始截取,和上面效果一樣
a=${stringa%%f} 去掉變量stringa後綴f。
echo ${stringZ/abc/xyz} 變量中字符串 abc被xyz替換
echo ${stringZ/#abc/XYZ} 用‘XYZ‘替換開頭的‘abc‘.
echo ${stringZ/%abc/XYZ} 用‘XYZ‘替換結尾的‘abc‘.

you_id=${USER}-on-${HOSTNAME}
you_id=$USER\-on-$HOSTNAME
echo $you_id root-on-db1 效果一樣。變量與字符串混合輸出
val=${1##+(0)} # 使用局部變量, 匹配最長連續的一個或多個0.


引用:${backup_DIR}/$DATE
#備份的變量:
backup_dir=/home/mysql/mysql_bak
date=`date -d "+%Y%m%d %H:%M:%d"`
yes_time=`date -d yesterday "+%Y%m%d"`
mkdir -p /opt/chen$date\nailong chen20160608nailong
date -d "2 day ago" +"%Y-%m-%d" 昨天日期
date -d "1 week ago" +"%Y-%m-%d" 上周日期
date +%Y%m%d%h%M

單引號(‘ ‘)操作與雙引號基本一樣, 但是不允許引用變量, 因為$的特殊意義被關閉了. 在單引號中,
任何特殊字符都按照字面的意思進行解釋, 除了‘. 所以說單引號("全引用")是一種比雙引號("部分引
用")更嚴格的引用方法.


‘‘ 單引號屏蔽所有特殊字符
"" 雙引號屏蔽部分特殊字符

【eval】

兩次掃描

test.txt內容:hello shell world!

myfile="cat test.txt"

(1)echo $myfile  #result:cat test.txt

(2)eval echo $myfile  #result:hello shell world!

【echo】
echo -e 處理特殊字符,解釋特殊字符。生效特殊字符
echo -n 不換行輸出
echo -e "a\ndddd" //自動換行
echo $(ls -al)不換行 echo "$(ls -al)" 換行

bash$ echo hello\!
hello!
bash$ echo "hello\!"
hello\!
bash$ echo -e x\ty
xty
bash$ echo -e "x\ty"
x y

echo "chen" >> file :把chen內容追加到file文件中來,不覆蓋
echo "chen" > file :覆蓋了!!!


[A-Za-z0-9]
截取hello字符串: # VAR=‘hello world!‘ # echo ${VAR:0:5} hello
截取world字符串: # echo ${VAR:5:-1} world
截取最後一個字符: # echo ${VAR:(-1)} !


######################## (( ... ))結構可以用來計算並測試算術表達式的結果.
#!/bin/bash
((5 > 4))
echo $?
echo "Exit status of \"((5 > 4))\" is $?."

【從鍵盤輸入-不止是read】
command << word
any input
word


read -p "Your command: " CMD
until [ $CMD == ‘q‘ ]; do
! which $CMD && echo "Wrong command" && read -p "Input again:" CMD && continue
COMMAND=` which $CMD | grep -v "^alias" | grep -o "[^[:space:]]\{1,\}"`
bincp $COMMAND
echo "copy $COMMAND finished."
read -p "Continue: " CMD
done

【輸出到屏幕上】
cat << word
-----------
name id
word
【腳本中調用】 source _function.sh
【shell函數】
hello ()
{
echo `date`
}
hello ###這兒直接寫hello
`反引號允許你將shell命令的輸出賦值給變量
today=`date +%Y%m%d`
echo "today is `date +%Y%m%d`"

sleep 5 #過五秒再執行


【basename】
$ basename /tmp/test/file.txt
file.txt
$ basename /tmp/test/file.txt .txt
file

【dirname】
dirname /var/log/messages 獲取文件或文件夾的路徑(上一級)
/var/log

【數組】
var=("123" "456" "789")
var[1]=123
var[2]=456
echo "$var[1],$var[2]"
#

echo $? 條件為真,輸出0,條件為否,輸出1
cp 1.txt /opt/apps/2.txt >/dev/null 2>&1
status=$?
echo $? #如果cp這個命令成功的話,輸出0,不成功的話,輸出1

:冒號在此是占位符,{str:=expr} 如果變量str不為空,${str:=expr}就等於str的值,若str為空,就把expr的值賦值給str
: >> target_file 如果這個文件之前並不存在, 那麽就創建它
if [ $name="" ] 如果這個變量為空值
then : # 什麽都不做,引出分支.
if [ ! -s 22.txt ] 如果22.txt這個文件為空
或者是 if [ -z 22.txt ]

[ $I -eq 1 ] && MIN=$MYRAND

if [ -s $name ] 如果這個變量為空
if [ -d $path ] 如果目錄存在
if [ -s $path ] 如果目錄存在
if [ -n "$1" ] # 測試是否有命令行參數(非空).
-a 文件存在 YES !
-f 這是一個一般文件
-d 這是一個目錄
-b 這是一個快設備(軟盤,硬盤,光驅等)
-c 這是一個字符設備(鍵盤,聲卡等)
-p 這個文件是一個管道
-h 或者 -L 這是一個符號鏈接
-r 文件是否可讀
-w 文件是否可寫
-x 文件是否可執行
-O 你是否為文件擁有者
-G 文件group-id是否與你相同
f1 -nt f2 文件f1比文件f2新
f1 -ot f2 文件f1比文件f2舊


shell 相關知識(1)