此種問題只在 Ubuntu 下才會出現!安裝 debian 系統根本不存在此類問題,因為只有Ubuntu 把默認的 bash 替換成了 dash.
在學習 Shell 腳本的時候,有兩個例子在運行時出現異常。比如,我在 test-dash.sh腳本輸入如下內容:?
echo -e "Trekshot. \a \n"?
declare -i number=7?
echo $number?
在 Ubuntu 系統下使用 sh test-bash.sh 運行將出現如下提示信息:?
-e Trekshot.?
test-dash.sh: 2: declare: not found:?
有兩個問題:?
a. echo 的參數 '-e' 怎么也打印出來了??
b. 一個簡單的整數聲明語句為何提示 "declare: not found"??
1.出現此問題的原因并非代碼本身有誤,而是 Ubuntu 系統的問題。我們在編寫腳本時,第一行經常要寫這么一行內容:#!/bin/bash. 這是對該腳本所使用的 shell 進行聲明,因為Linux 上的 shell 并非只有一種,而各個 shell 的語法是由差別的。之所以把 echo 命令的參數誤打出來,就是因為 sh 命令沒有理解該語法,即當前使用的并不是 bash.下面來證明:?
獲取 /bin 中相關文件的屬性:?
-rwxr-xr-x 1 root root 725136 2008-05-13 02:48 bash?
-rwxr-xr-x 1 root root 87924 2008-06-21 00:07 dash?
lrwxrwxrwx 1 root root 4 2010-03-25 14:29 sh -> dash?
這表明在執行 sh test-dash.sh 的時候,我們使用的是一個叫 "dash" 的命令(注意 sh實為鏈接文件),而并不是腳本第一行中聲明的 bash. 這就是上面現象的原因。 其實,如果使用 bash test-dash.sh 命令執行的話,上面兩個錯誤根本不會出現。?
2.dash(Debian Almquist SHell) Ubuntu 自 6.10 后,將先前的 bashshell 更換成了dash (有待考證). 在設置 dash 的說明中有下面文字:?
The default /bin/sh shell on Debian and Debian-based systems is bash.?
However, since the default shell is required to be POSIX-compliant, any?
shell that conforms to POSIX, such as dash, can serve as /bin/sh. You may?
wish to do this because dash is faster and smaller than bash.?
大致意思是說默認的 shell 是 bash shell, 但只要是能兼容 POSIX 的 shell 都可以,而dash 比 bash 速度更快、更小巧,因此 Ubuntu 安裝了 dash.?
3.怎么能把 dash 去掉而使用默認的 bash?使用如下命令:?
sudo dpkg-reconfigure dash?
此命令是對已安裝的包進行重新配置,在菜單(dash-bash-sh.png)中選擇是否將 sh 鏈接到 dash (Install dash as /bin/sh?) 選擇否即可。?
附圖一:Ubuntu 下設置 dash 界面
pg_dump -U postgres -d mydatabase > dump.sql
從sql文件導入數據:
psql -d newdatabase -U postgres -f dump.sql
執行sql文件:
在相應的數據庫中 \i sql文件 (這個如果是在windows下,要將\改為/)
在shell中 psql -s 數據庫名 -f sql文件
下面這個是基本sql的
進入vi的命令
vi filename :打開或新建文件,并將光標置于第一行首
vi +n filename :打開文件,并將光標置于第n行首
vi + filename :打開文件,并將光標置于最后一行首
vi +/pattern filename:打開文件,并將光標置于第一個與pattern匹配的串處
vi -r filename :在上次正用vi編輯時發生系統崩潰,恢復filename
vi filename....filename :打開多個文件,依次進行編輯
?
移動光標類命令
h :光標左移一個字符
l :光標右移一個字符
space:光標右移一個字符
Backspace:光標左移一個字符
k或Ctrl+p:光標上移一行
j或Ctrl+n :光標下移一行
Enter :光標下移一行
w或W :光標右移一個字至字首
b或B :光標左移一個字至字首
e或E :光標右移一個字至字尾
) :光標移至句尾
( :光標移至句首
}:光標移至段落開頭
{:光標移至段落結尾
nG:光標移至第n行首
n+:光標下移n行
n-:光標上移n行
n$:光標移至第n行尾
H :光標移至屏幕頂行
M :光標移至屏幕中間行
L :光標移至屏幕最后行
0:(注意是數字零)光標移至當前行首
$:光標移至當前行尾
?
屏幕翻滾類命令
Ctrl+u:向文件首翻半屏
Ctrl+d:向文件尾翻半屏
Ctrl+f:向文件尾翻一屏
Ctrl+b;向文件首翻一屏
nz:將第n行滾至屏幕頂部,不指定n時將當前行滾至屏幕頂部。
?
插入文本類命令
i :在光標前
I :在當前行首
a:光標后
A:在當前行尾
o:在當前行之下新開一行
O:在當前行之上新開一行
r:替換當前字符
R:替換當前字符及其后的字符,直至按ESC鍵
s:從當前光標位置處開始,以輸入的文本替代指定數目的字符
S:刪除指定數目的行,并以所輸入文本代替之
ncw或nCW:修改指定數目的字
nCC:修改指定數目的行
?
刪除命令
ndw或ndW:刪除光標處開始及其后的n-1個字
do:刪至行首
d$:刪至行尾
ndd:刪除當前行及其后n-1行
x或X:刪除一個字符,x刪除光標后的,而X刪除光標前的
Ctrl+u:刪除輸入方式下所輸入的文本
?
搜索及替換命令
/pattern:從光標開始處向文件尾搜索pattern
?pattern:從光標開始處向文件首搜索pattern
n:在同一方向重復上一次搜索命令
N:在反方向上重復上一次搜索命令
:s/p1/p2/g:將當前行中所有p1均用p2替代
:n1,n2s/p1/p2/g:將第n1至n2行中所有p1均用p2替代
:g/p1/s//p2/g:將文件中所有p1均用p2替換
?
選項設置
all:列出所有選項設置情況
term:設置終端類型
ignorance:在搜索中忽略大小寫
list:顯示制表位(Ctrl+I)和行尾標志($)
number:顯示行號
report:顯示由面向行的命令修改過的數目
terse:顯示簡短的警告信息
warn:在轉到別的文件時若沒保存當前文件則顯示NO write信息
nomagic:允許在搜索模式中,使用前面不帶“\”的特殊字符
nowrapscan:禁止vi在搜索到達文件兩端時,又從另一端開始
mesg:允許vi顯示其他用戶用write寫到自己終端上的信息
?
最后行方式命令
:n1,n2 co n3:將n1行到n2行之間的內容拷貝到第n3行下
:n1,n2 m n3:將n1行到n2行之間的內容移至到第n3行下
:n1,n2 d :將n1行到n2行之間的內容刪除
:w :保存當前文件
:e filename:打開文件filename進行編輯
:x:保存當前文件并退出
:q:退出vi
:q!:不保存文件并退出vi
:!command:執行shell命令command
:n1,n2 w!command:將文件中n1行至n2行的內容作為command的輸入并執行之,若不指定n1,n2,則表示將整個文件內容作為command的輸入
:r!command:將命令command的輸出結果放到當前行
?
寄存器操作
"?nyy:將當前行及其下n行的內容保存到寄存器?中,其中?為一個字母,n為一個數字
"?nyw:將當前行及其下n個字保存到寄存器?中,其中?為一個字母,n為一個數字
"?nyl:將當前行及其下n個字符保存到寄存器?中,其中?為一個字母,n為一個數字
"?p:取出寄存器?中的內容并將其放到光標位置處。這里?可以是一個字母,也可以是一個數字
ndd:將當前行及其下共n行文本刪除,并將所刪內容放到1號刪除寄存器中。
ls 列出當前目錄文件(不包括隱含文件)
ls -a 列出當前目錄文件(包括隱含文件)
ls -l 列出當前目錄下文件的詳細信息
cd .. 回當前目錄的上一級目錄
cd - 回上一次所在的目錄
cd ~ 或 cd 回當前用戶的宿主目錄
mkdir 目錄名 創建一個目錄
rmdir 空目錄名 刪除一個空目錄
rm 文件名 文件名 刪除一個文件或多個文件
rm -rf 非空目錄名 刪除一個非空目錄下的一切
mv 路經/文件 /經/文件 移動相對路經下的文件到絕對路經下
mv 文件名 新名稱 在當前目錄下改名
find 路經 -name “字符串” 查找路經所在范圍內滿足字符串匹配的文件和目錄
fdisk -l 查看系統分區信息
fdisk /dev/sdb 為一塊新的SCSI硬盤進行分區
chown root /home 把/home的屬主改成root用戶
chgrp root /home 把/home的屬組改成root組
chmod XXX filename
×××(所有者\組用戶\其他用戶)
×=4 讀的權限 ×=2 寫的權限 ×=1 執行的權限
sudo chmod 600 ××× (只有所有者有讀和寫的權限)
sudo chmod 644 ××× (所有者有讀和寫的權限,組用戶只有讀的權限)
sudo chmod 700 ××× (只有所有者有讀和寫以及執行的權限)
sudo chmod 666 ××× (每個人都有讀和寫的權限)
sudo chmod 777 ××× (每個人都有讀和寫以及執行的權限)
文件權限除了r、w、x外還有s、t、i、a權限:
s:文件屬主和組設置SUID和GUID,文件在被設置了s權限后將以root身份執行。在設置s權限時文件屬主、屬組必須先設置相應的x權限,否 則s權限并不能正真生效(c h m o d命令不進行必要的完整性檢查,即使不設置x權限就設置s權限,chmod也不會報錯,當我們ls -l時看到rwS,大寫S說明s權限未生效)。Linux修改密碼的passwd便是個設置了SUID的程序,普通用戶無讀寫/etc/shadow文件 的權限確可以修改自己的密碼。
ls -al /usr/bin/passwd
-rwsr-xr-x 1 root root 32988 2008-12-08 17:17 /usr/bin/passwd
我們可以通過字符模式設置s權限:chmod a+s filename,也可以使用絕對模式進行設置:
設置s u i d:將相應的權限位之前的那一位設置為4;
設置g u i d:將相應的權限位之前的那一位設置為2;
兩者都置位:將相應的權限位之前的那一位設置為4+2=6。
如:chmod 4764 filename?? //設置SUID
t :設置粘著位,一個文件可讀寫的用戶并一定相讓他有刪除此文件的權限,如果文件設置了t權限則只用屬主和root有刪除文件的權限,通過chmod +t filename 來設置t權限。
i:不可修改權限??例:chattr u+i filename 則filename文件就不可修改,無論任何人,如果需要修改需要先刪除i權限,用chattr -i filename就可以了。查看文件是否設置了i權限用lsattr filename。
a:只追加權限, 對于日志系統很好用,這個權限讓目標文件只能追加,不能刪除,而且不能通過編輯器追加。可以使用chattr +a設置追加權限。
Useradd 創建一個新的用戶
Groupadd 組名 創建一個新的組
Passwd 用戶名 為用戶創建密碼
Passwd -d用戶名 刪除用戶密碼也能登陸
Passwd -S用戶名 查詢賬號密碼
Usermod -l 新用戶名 老用戶名 為用戶改名
Userdel–r 用戶名 刪除用戶一切
tar -c 創建包 –x 釋放包 -v 顯示命令過程 –z 代表壓縮包
tar –cvf benet.tar /home/benet 把/home/benet目錄打包
tar –zcvf benet.tar.gz /mnt 把目錄打包并壓縮
tar –zxvf benet.tar.gz 壓縮包的文件解壓恢復
tar –jxvf benet.tar.bz2 解壓縮
make 編譯
make install 安裝編譯好的源碼包
reboot Init 6 重啟LINUX系統
Halt Init 0 Shutdown –h now 關閉LINUX系統
uname -a 查看內核版本
cat /etc/issue 查看ubuntu版本
lsusb 查看usb設備
sudo ethtool eth0 查看網卡狀態
cat /proc/cpuinfo 查看cpu信息
lshw 查看當前硬件信息
sudo fdisk -l 查看磁盤信息
df -h 查看硬盤剩余空間
free -m 查看當前的內存使用情況
ps -A 查看當前有哪些進程
kill 進程號(就是ps -A中的第一列的數字)或者 killall 進程名( 殺死一個進程)
kill -9 進程號 強制殺死一個進程
常用apt命令:
apt-cache search package 搜索包
apt-cache show package 獲取包的相關信息,如說明、大小、版本等
sudo apt-get install package 安裝包
sudo apt-get install package - - reinstall 重新安裝包
sudo apt-get -f install 修復安裝”-f = –fix-missing”
sudo apt-get remove package 刪除包
sudo apt-get remove package - - purge 刪除包,包括刪除配置文件等
sudo apt-get update 更新源
sudo apt-get upgrade 更新已安裝的包
sudo apt-get dist-upgrade 升級系統
sudo apt-get dselect-upgrade 使用 dselect 升級
apt-cache depends package 了解使用依賴
apt-cache rdepends package 是查看該包被哪些包依賴
sudo apt-get build-dep package 安裝相關的編譯環境
apt-get source package 下載該包的源代碼
sudo apt-get clean && sudo apt-get autoclean 清理無用的包
sudo apt-get check 檢查是否有損壞的依賴
清理所有軟件緩存(即緩存在/var/cache/apt/archives目錄里的deb包 )
sudo apt-get clean