歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> SHELL編程 >> Shell編程入門

Shell編程入門

日期:2017/3/1 9:25:54   编辑:SHELL編程

背景知識

Shell 是用戶與內核進行交互操作的一種接口,是 Linux 最重要的軟件之一。目前最流行的 Shell 稱為 bash Shell,bash Shell 腳本編程以其簡潔、高效而著稱,多年來成為 Linux 程序員和系統管理員解決實際問題的利器。Shell 是操作系統的最外層。Shell 合並編程語言以控制進程和文件,以及啟動和控制其它程序。Shell 通過提示您輸入,向操作系統解釋該輸入,然後處理來自操作系統的任何結果輸出來管理您與操作系統之間的交互。Shell 提供了與操作系統通信的方式。此通信以交互的方式(來自鍵盤的輸入立即操作)或作為一個 Shell 腳本執行。Shell 腳本是Shell 和操作系統命令的序列,它存儲在文件中。當登錄到系統中時,系統定位要執行的 Shell 的名稱。在它執行之後,Shell 顯示一個命令提示符。普通用戶的此提示符通常是一個 $(美元符)。當提示符下輸入命令並按下 Enter 鍵時,Shell 對命令進行求值,並嘗試執行它。取決於命令說明,Shell 將命令輸出寫到屏幕或重定向到輸出。然後它返回命令提示符,並等待您輸入另一個命令。命令行是輸入所在的行,它包含 Shell 提示符。每行的基本格式如下:

  $ 命令 參數(一個或多個)

Shell 視命令行的第一個字(直到第一個空格)為命令,所有後繼字為自變量。

在此推薦大家使用zsh,具體下載安裝版本在 http://www.linuxidc.com/Linux/2013-09/90377.htm

使用 Zsh 的九個理由 http://www.linuxidc.com/Linux/2013-05/84191.htm

Zsh使用心得三則 http://www.linuxidc.com/Linux/2012-08/67735.htm

Linux下安裝終極Shell Zsh http://www.linuxidc.com/Linux/2012-08/67734.htm

1:判斷文件是否為塊設備或字符設備文件,如果是將其拷貝到/dev 目錄下

#!/bin/bash

read -p "please input a filename:" filename
if test -b "$filename" -o -c "$filename";then
echo "$filename is a device file" && cp $filename /dev
else
echo "$filename is not a device file"
fi

2:模擬 Linux 登陸 Shell

#!/bin/bash

x=wj #這是用戶名
y=1111 #這是密碼
read -p "please input yourname:" yourname
read -p "please input yourkey:" yourkey
if test "$x" = "$yourname" -a "$y" = "$yourkey" ;then bash #注意test後面比較大小的空格不能省
else
  echo"please try again"
fi

3:從鍵盤讀取兩個數,並比較兩個數大小,並打印結果

#!/bin/bash

read -p "please input num1:" num1
read -p "please input num2:" num2
if test $num1 = $num2 ;then
  echo "num1=num2"
elif test $num1 -gt $num2 ;then
  echo "num1>num2"
else test $num1 -lt $num2
  echo "num1<num2"
fi


4:查找/root/目錄下是否存在指定文件

#!/bin/bash

cd /root
read -p "please input filename:" filename
if test -e $filename;then
echo "$filename is exist"
else
echo "$filename is not exist"
fi

5:刪除當前目錄下大小為 0 的文件

#/bin/bash

for filename in `ls`
do
if test -d $filename;then
  b=1
 else
  a=$(ls -l $filename | awk '{ print $5 }')
if test $a -eq 0;then
    rm $filename
fi
fi
done

6:查找最大文件

#!/bin/bash

a=0
for name in *
do
if test -d $name;then
    c=1
else
    b=$(ls -l $name | awk '{print $5}')
    if test $b -ge $a;then
      a=$b
namemax=$name
fi
fi
done
echo "the max file is $namemax"

7:打印當前用戶(不用 whoami)

#!/bin/bash


echo "Current User is :"echo $(who | sed -n '1p' | awk '{print $1}')

8:查找當前目錄中所有大於 50k 的文件,把這些文件名寫到一個文本文件中,並統計其個數

#!/bin/bash

find ./ -size +50k > toingji.txt
cat tongji.txt |wc -l

9:一個函數,利用 shift 計算所有參數乘積,假設參數均為整數

#!/bin/bash

result=1
# $#表示參數個數
while test $# -gt 0
do
result=`expr $1 \* $result`
shift
done
echo "the result is $result"

10:測試一個文件是否已經被排序過

#!/bin/bash

read -p "please input your filename:" file
sort -C $file
# $?表示執行上一個指令的返回值 (顯示最後命令的退出狀態。0表示沒有錯誤,其他任何值表明有錯誤)
a=$?
if test $a -eq 0 ;then
  echo "$file is youxu"
else
  echo "$file is wuxu"
fi

11:判斷用戶是否在運行

#!/bin/bash

a=$(ps | grep "$$" | awk '{print $2}')
b=$( who| grep "$a" | awk '{print $1}')
read -p "please input a username:" username
if [ "$b" = "$username" ];then
echo "the ueser is running"
else
echo "the ueser is not running"
fi

12:在當前目錄下交互式創建文件夾(文件夾已存在則打印提示輸入新名字)

#!/bin/bash

read -p "please input dirname:" file
if test -d $file;then
echo dir is exist please try again
else
read -p "create dir now?[y/n] " sel
if test "$sel" = "y";then
mkdir $file
elif test "$sel" = "n";then
bash
else
echo "Your input is wrong"
fi
fi

13:獲取本機 IP 地址

#!/bin/bash

a=$(ifconfig | grep "inet 地址:" | awk '{print $2}' | sed 's/地址://g' |sed -n '1p' )
echo "ip is $a"

14:打印無密碼用戶

#!/bin/bash

echo "no passwd user are:"
a=$(sudo cat /etc/shadow | grep "*" | awk 'BEGIN { FS=":" }{print $1}')
#在處理輸入文件以前,域分隔符(FS)被設為冒號
echo $a

15:寫一個腳本,利用循環計算 n的階乘

#!/bin/bash

read -p "please input n:" n
sum=1
for a in `seq 1 $n`
do
sum=`expr $sum \* $a`
done
echo "n! = $sum"

16:利用 case 語句測試輸入字符是否是:小寫/大寫/數字/其他

#!/bin/bash

read -p "please input something:" Key
case $Key in
[[:lower:]]) echo "It is lowercase";;
[[:upper:]]) echo "It is uppercase";;
[0-9]) echo "It is number";;
esac

17:測試文件是否包含特定的文本內容

#!/bin/bash

read -p "enter a string: " string
read -p "enter a filename: " filename
grep -q "$string" $filename #在file中查找str(不輸出找到的內容),成功返回0
if test $? -eq 0;then
echo "The text exists in the file"
else
echo "Text does not exist in the file"
fi

18:檢測給定的單詞是否為詞典中的單詞

#!/bin/bash

read -p "enter a string:" string
#/usr/share/dict/american-english是Ubuntu 系統中英式英語常用單詞列表的字典文件
grep -q "$string" /usr/share/dict/american-english
if test $? -eq 0;then
echo "match directionary"
else
echo "not match directionary"
fi

Copyright © Linux教程網 All Rights Reserved