$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 $substring
stringZ=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 $length
expr 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 $string
stringZ=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ó caller
trap
bash -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à .bashrc
bash
$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_profile
head -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 $HOME
head -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
.