$BASH: Đường dẫn tới bash$BASHPID: Số hiệu tiến trình bash hiện hành$BASH_VERSION: Phiên bản bash$BASH_VERSIONINFO[n]: Phiên bản bash$HOME$HOSTNAME$HOSTTYPE
Nguyễn Hải Châu (nhchau@gmail.com)
Trường Đại học Công nghệ, ĐHQGHN
$BASH: Đường dẫn tới bash$BASHPID: Số hiệu tiến trình bash hiện hành$BASH_VERSION: Phiên bản bash$BASH_VERSIONINFO[n]: Phiên bản bash$HOME$HOSTNAME$HOSTTYPE$UID: user ID$EUID: effective UserID$PATH: Đường dẫn$SECONDS: Script đã chạy được bao nhiêu giây$1, .., \$9, \$#, \$*, \$@$!: PID của script mới nhất đang chạy nền$$: PID của script$?: Trạng thái exit$_: Tham số cuối cùng của lệnh vừa thực hiệnecho $BASH, $BASH_VERSION, $BASHPID
for n in 0 1 2 3 4 5
do
echo "BASH_VERSINFO[$n] = ${BASH_VERSINFO[$n]}"
done
## /usr/bin/bash, 4.3.42(1)-release, 24016
## BASH_VERSINFO[0] = 4
## BASH_VERSINFO[1] = 3
## BASH_VERSINFO[2] = 42
## BASH_VERSINFO[3] = 1
## BASH_VERSINFO[4] = release
## BASH_VERSINFO[5] = x86_64-redhat-linux-gnu
-r readonly: Biến chỉ đọc-i integer: Biến nguyên-a array: Biến mảng-f function: Tên hàm-x export: Biến có thể export giá trị ra ngoài môi trường của script$RANDOM: Sinh số giả ngẫu nhiên từ 0 đến 32767echo $RANDOM
echo $RANDOM
echo $RANDOM
## 25371
## 10948
## 16566
${#string}, expr length $str, expr "$string":'.*'expr match "$string" '$substring', expr "$string" : '$substring'stringZ=abcABC123ABCabc
echo ${#stringZ} # 15
echo `expr length $stringZ` # 15
echo `expr "$stringZ" : '.*'` # 15
## 15
## 15
## 15
stringZ=abcABC123ABCabc
# |------|
# 12345678
echo `expr match "$stringZ" 'abc[A-Z]*.2'` # 8
echo `expr "$stringZ" : 'abc[A-Z]*.2'` # 8
## 8
## 8
expr index $string $substringstringZ=abcABC123ABCabc
expr index $stringZ "ABC"
## 4
${string:position}${string:position:length}stringZ=abcABC123ABCabc
echo ${stringZ:5}
echo ${stringZ:5:3}
## C123ABCabc
## C12
expr substr $string $position $lengthexpr match "$string" '\($substring\)'expr "$string" : '\($substring\)'tel.csv là một file text có nhiều dòng,
mỗi dòng có các trường thông tin cách nhau bởi dấu ,. Hãy tính số
lượng các số điện thoại MobiFone, VinaPhone, VietTel, ... trong file đó.head -6 tel.csv
## 1,08485876443,"KIM Van Chien",,"a"
## 2,0912025544,"Đỗ Thị Phi Nga","Giảng viên chính Thạc sỹ","Khoa Sư phạm Tiếng Anh/Faculty of English"
## 3,0983669908,"Bùi Minh Đức","Thạc Sỹ","Khoa Công nghệ Thông tin"
## 4,0949844646,"Bùi Thu Hà","Tiến sĩ","Khoa Sinh Học"
## 5,01648462188,"bui thuy dung",,
## 6,0904394041,"Bùi Tiến Long",,"Trung tâm Thông tin - Thư viện"
${string#substring}: Xóa chuỗi con ngắn nhất tính từ đầu $string${string##substring}: Xóa chuỗi con dài nhất tính từ đầu $string${string%substring}: Xóa chuỗi con ngắn nhất tính từ cuối $string${string%%substring}: Xóa chuỗi con dài nhất tính từ cuối $stringstringZ=abcABC123ABCabc
echo ${stringZ#a*C}
echo ${stringZ##a*C}
echo ${stringZ%A*c}
echo ${stringZ%%A*c}
## 123ABCabc
## abc
## abcABC123
## abc
stringZ=abcABC123ABCabc
echo ${stringZ/ABC/...}
echo ${stringZ//ABC/...}
echo ${stringZ/#abc/...}
echo ${stringZ/%abc/...}
## abc...123ABCabc
## abc...123...abc
## ...ABC123ABCabc
## abcABC123ABC...
${parameter-default}, ${parameter:-default}: Nếu parameter không có giá trị, sử dụng giá trị default${parameter=default}, ${parameter:=default}: Nếu parameter không có giá trị, gán parameter bằng defaultvar1=1
var2=2
echo $var3
echo ${var1-var2}
echo ${var3-$var2}
##
## 1
## 2
${parameter+altvalue}, ${parameter:+alt_value}: Nếu parameter được gán, sử dụng altvalue, ngược lại NULL${parameter?errmsg}, ${parameter:?err_msg}: Nếu parameter được gán, sử dụng giá trị, in ra errmsg và thoát
khỏi script với giá trị 1var1=1
echo $var2
echo ${var1+xyz}
echo ${var1+xyz}
##
## xyz
## xyz
${!varprefix*}, ${!varprefix@}: Tên các biến bắt đầu bằng varprefix# Tên các biến môi trường bắt đầu với chữ H
echo ${!H*}
echo ${!H@}
## HISTCMD HISTCONTROL HISTSIZE HOME HOSTNAME HOSTTYPE
## HISTCMD HISTCONTROL HISTSIZE HOME HOSTNAME HOSTTYPE
if [ condition1 ]
then
command...
elif [ condition2 ]
command...
else
command...
fi
case $variable in
"$condition1")
command...
;;
"$condition2")
command...
;;
...
*) # default
command...
;;
esac
#!/usr/bin/bash
case "$1" in
start) echo start service;;
stop) echo stop service;;
restart) echo restart service;;
*) echo wrong option!
echo "Usage: case start|stop|restart"
;;
esac
#!/usr/bin/bash
select variable [in list]
do
command
break
done
select thường được sử dụng để làm menu tương tác#!/bin/bash
select opt in "Print document" "Edit document" "Quit" ; do
if [ "$opt" = "Quit" ]; then
echo done
exit
elif [ "$opt" = "Edit document" ]; then
echo Editing...
elif [ "$opt" = "Print document" ]; then
echo Printing...
else
clear
echo Wrong option
fi
done
for arg in [list]
do
command...
done
for arg in a b c
do
echo $arg
done
## a
## b
## c
while [ condition ]
do
command...
done
cat while.sh
./while.sh p1 p2 p3
## while [ $# -gt 0 ]
## do
## echo $1
## shift
## done
## p1
## p2
## p3
until [ condition is true ]
do
command...
done
cat until.sh
./until.sh p1 p2 p3
## until [ $# -eq 0 ]
## do
## echo $1
## shift
## done
## p1
## p2
## p3
script=`command`
echo Command output is $script
multi=$(command1;command2)
echo Multiple output is $multi
s1=`who`
s2=$(ls|wc -l; date)
echo Who logged in? $s1
echo Multi: $s2
## Who logged in? chau tty2 2016-11-01 20:37 (:1)
## Multi: 115 Sat Nov 5 12:18:08 ICT 2016
expr thay cho let hoặc (())a=1
b=2
c=`expr $a + $b`
echo $c
## 3
declare -a arrayvar
arrayvar[1]=23
arrayvar[4]=35
echo $((arrayvar[1]+arrayvar[4]))
echo $((arrayvar[1]+arrayvar[3]))
barray=( 1 2 3 4 5 )
echo ${barray[1]} ${barray[3]}
echo ${arrayvar[1]} ${arrayvar[3]}
## 58
## 23
## 2 4
## 23
a=a_character
a_character=C
echo $a
eval tmp=\$$a
echo $tmp
## a_character
## C
a="ps -fu chau | head -9"
eval $a
## UID PID PPID C STIME TTY TIME CMD
## chau 1514 1 0 Nov01 ? 00:00:00 /usr/lib/systemd/systemd --user
## chau 1518 1514 0 Nov01 ? 00:00:00 (sd-pam)
## chau 1530 1 0 Nov01 ? 00:00:00 /usr/bin/gnome-keyring-daemon --daemonize --login
## chau 1533 1510 0 Nov01 tty2 00:00:00 /usr/libexec/gdm-x-session --run-script gnome-session
## chau 1542 1533 0 Nov01 tty2 00:00:10 /usr/libexec/gnome-session-binary
## chau 1553 1514 0 Nov01 ? 00:00:08 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
## chau 1588 1542 0 Nov01 tty2 00:01:40 goldendict
## chau 1593 1514 0 Nov01 ? 00:00:00 /usr/libexec/at-spi-bus-launcher
function function_name {
command...
return value
}
value chỉ nằm trong khoảng 0 đến 255 (1 byte)function_name p1 p2 ...
trong đó p1, p2 ... là các tham số

./bug1.sh
## ./bug1.sh: line 9: [37: command not found
tee để lưu lại dòng dữ liệu ở các đoạn code lỗi-n, -v, -x để bật và +n, +v, +x
để tắt các chế độ debug tương ứng.assert kèm điều kiện kiểm tra biến$LINENO và lệnh sẵn có callertrapbash -n script kiểm tra cú pháp của script và không thực thi script đóbash -v script hiển thị mỗi lệnh trước khi thực hiện lệnh đóbash -x script hiển thị kết quả mỗi lệnh sau khi thực hiện lệnh-n, -v, -x có thể sử dụng kết hợp:
-nv: Kiểm tra cú pháp + hiển thị mỗi dòng lệnh được kiểm tra-xv: Hiển thị lệnh trước khi thực hiện và kiểm tra kết quả sau khi thực hiện.bash_profile và .bashrcbash
$HOME của mỗi người sử dụngbash script.bash_profile: Được tự động thực hiện khi người sử dụng login vào hệ thống.bashrc: Được tự động thực hiện mỗi lần bash được gọi đến$HOME không có .bash_profile và .bashrc, .profile sẽ được gọi thay thế.bash_profilehead -15 $HOME/.bash_profile
## # .bash_profile
##
## # Get the aliases and functions
## if [ -f ~/.bashrc ]; then
## . ~/.bashrc
## fi
##
## # User specific environment and startup programs
##
## export PATH=/usr/java/default/bin:$PATH:$HOME/.local/bin:$HOME/bin:$HOME/Android/Sdk/tools:$HOME/Android/Sdk/platform-tools:/usr/lib/rstudio/bin
## export PATH=$PATH:$HOME/bin:/usr/local/cuda/bin
## export LD_LIBRARY_PATH=/lib64:/usr/lib64:/lib:/usr/lib:$HOME/lib
## export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/lib
##
## # export CLASSPATH=/usr/share/java:$HOME/source/java:/$HOME/tmp/t/citygml4j-2.0ea-java6/lib
.bashrc~ tương đương với $HOMEhead -15 ~/.bashrc
## # .bashrc
##
## # Source global definitions
## if [ -f /etc/bashrc ]; then
## . /etc/bashrc
## fi
##
## # User specific aliases and functions
## alias ssh='ssh -D9999 -X'
## alias n4m="simple-mtpfs $HOME/Nexus4"
## alias n4u="fusermount -u $HOME/Nexus4"
## # alias skype="cd $HOME/bin/sky;./skype >/dev/null 2> /dev/null&"
## alias texcomp='latex $1.tex;dvipdf $1.dvi'
## # alias tb='psql --host=112.137.129.222 --port=4488 --username=postgres --password --dbname=csdl_taybac'
## alias tb='psql --host=112.137.132.48 --port=4488 --username=postgres --password --dbname=csdl_taybac'
saferm. Script này xóa file một
cách an toàn, nghĩa là lệnh saferm myfile sẽ không xóa myfile
mà chuyển myfile vào một thư mục ~/.TRASH. Các file trong ~/.TRASH
sẽ bị xóa định kỳ sau 36 giờ. Tương ứng với saferm cần viết một script
saferestore để khôi phục file nếu như bị file đó bị xóa nhầm.$HOME của người sử dụng
nằm trong /home và tính tổng dung lượng lưu trữ của từng người sử dụng để kiểm
soát quota. Script cần in ra dữ liệu có ba cột: tên người sử dụng, thư mục $HOME
và dung lượng hiện đang sử dụng. Danh sách người sử dụng lấy trong /etc/passwd.find.