Linux-03shell語法複習與習題

来源:https://www.cnblogs.com/han-fei/archive/2023/12/17/17909071.html
-Advertisement-
Play Games

習題要求 創建好作業後,先進入文件夾/home/acs/homework/lesson_3/,然後: (0) 進入homework_0文件夾,編寫自動完成lesson_1作業的腳本helper.sh。要求: [1] 當前目錄下僅包含helper.sh [2] helper.sh具有可執行許可權 [3] ...


習題要求


創建好作業後,先進入文件夾/home/acs/homework/lesson_3/,然後:

(0) 進入homework_0文件夾,編寫自動完成lesson_1作業的腳本helper.sh。要求:
    [1] 當前目錄下僅包含helper.sh
    [2] helper.sh具有可執行許可權
    [3] 在任意路徑依次執行下列命令後,lesson_1的作業可以得到滿分:
        1) homework 1 create
        2) /home/acs/homework/lesson_3/homework_0/helper.sh

(1) 進入homework_1文件夾,編寫腳本check_file.sh。要求:
    [1] 當前目錄下僅包含check_file.sh。
    [2] check_file.sh具有可執行許可權。
    [3] check_file.sh接收一個傳入參數。格式為 ./check_file.sh file
    [4] 判斷傳遞參數,分別在標準輸出中輸出如下內容(不包括雙引號):
        1) 如果傳入參數個數不是1,則輸出一行:"arguments not valid",然後退出,退出狀態等於1。
        2) 如果file文件不存在,則輸出一行:"not exist",然後退出,退出狀態等於2。
        3) 如果file文件存在,則輸出分別進行如下5個判斷,然後退出,退出狀態等於0。
            1] 如果file為普通文件,則輸出一行:"regular file"
            2] 如果file為目錄(文件夾),則輸出一行:"directory"
            3] 如果file具有可讀許可權,則輸出一行:"readable"
            4] 如果file具有可寫許可權,則輸出一行:"writable"
            5] 如果file具有可執行許可權,則輸出一行:"executable"

(2) 進入homework_2文件夾,編寫腳本main.sh。要求:
    [1] 當前目錄下僅包含main.sh
    [2] main.sh具有可執行許可權
    [3] 該文件從stdin(標準輸入)中讀取一個整數n
    [4] 在stdout(標準輸出)輸出斐波那契數列的第n項。即:a[0] = 1, a[1] = 1, a[i] = a[i - 1] + a[i - 2], 求a[n]。
    [5] 數據保證 0 <= n <= 20,腳本不需要判斷n的合法性。

(3) 進入homework_3文件夾,編寫腳本main.sh。要求:
    [1] 當前目錄下僅包含main.sh
    [2] main.sh具有可執行許可權
    [3] 該文件從stdin(標準輸入)中讀取兩行整數n和m
    [4] 在stdout(標準輸出)中輸出1~n的按字典序從小到大的順序數第m個全排列,輸出一行,用空格隔開所有數,行末可以有多餘空格。
    [5] 數據保證 1 <= n <= 10, 1 <= m <= min(100, n!),腳本不需要判斷數據的合法性。

(4) 進入homework_4文件夾,編寫腳本main.sh。要求:
    [1] 當前目錄下僅包含main.sh
    [2] main.sh具有可執行許可權
    [3] main.sh接收兩個傳入參數。格式為 ./main.sh input_file output_file
    [4] 從input_file中讀取一個正整數n,然後將前n個正整數的平方和寫入output_file中
    [5] 數據保證 1 <= n <= 100,腳本不需要判斷所有數據的合法性。

第零題


創建好作業後,先進入文件夾/home/acs/homework/lesson_3/,然後:

(0) 進入homework_0文件夾,編寫自動完成lesson_1作業的腳本helper.sh。要求:
    [1] 當前目錄下僅包含helper.sh
    [2] helper.sh具有可執行許可權
    [3] 在任意路徑依次執行下列命令後,lesson_1的作業可以得到滿分:
        1) homework 1 create
        2) /home/acs/homework/lesson_3/homework_0/helper.sh

homework 3 create
cd /home/acs/homework/lesson_3/homework_0
ls -a
vim helper.sh :wq
ls -l helper.sh
chmod +x helper.sh
vim helper.sh

# helper.sh內容如下:
#! /bin/bash
# 不能加空格
homework1_dir=/home/acs/homework/lesson_1/homework_

homework 1 create 0
# ${}是變數替換,$()是返回stdout
cd ${homework1_dir}0
for i in dir_a dir_b dir_c
do
	mkdir $i
done

homework 1 create 1
cd ${homework1_dir}1
for i in a.txt b.txt c.txt
do
	cp $i ${i}.bak
done

homework 1 create 2
cd ${homework1_dir}2
for i in a b c
do
	mv ${i}.txt ${i}_new.txt
done

homework 1 create 3
cd ${homework1_dir}3
for i in a.txt b.txt c.txt
do
	mv dir_a/${i} dir_b
done

homework 1 create 4
cd ${homework1_dir}4
for i in a.txt b.txt c.txt
do
	rm ${i}
done

homework 1 create 5
cd ${homework1_dir}5
for i in dir_a dir_b dir_c
do
#	echo $(pwd)/${i}
	rm ${i} -r
done

homework 1 create 6
cd ${homework1_dir}6
# done是關鍵字要使用雙引號,否則會找do去匹配
# mv task.txt dir_a/done.txt
mkdir dir_a
mv task.txt "dir_a/done.txt"

homework 1 create 7
cd ${homework1_dir}7
for ((i=0;i<3;i++))
do
	mkdir dir_${i}
#	for ((j=0;j<3;j++))
#	do
#		# 會操作3x3x3條
#		cp a.txt dir_${i}/a${j}.txt
#		cp b.txt dir_${i}/b${j}.txt
#		cp c.txt dir_${i}/c${j}.txt
#	done
	for j in a b c
	do
		cp ${j}.txt dir_${i}/${j}${i}.txt
	done
done

homework 1 create 8
cd ${homework1_dir}8
rm dir_a/a.txt
mv dir_b/b.txt dir_b/b_new.txt
cp dir_c/c.txt dir_c/c.txt.bak

homework 1 create 9
cd ${homework1_dir}9
rm *.txt

# 每次執行完之後調用一下
# homework 1 test
# helper.sh內容結束

# 註意事項
1. 開頭的 `#! /bin/bash` 如果不加的話會導致for迴圈報錯
2. 要保證目錄里只有一個文件:關掉vim
3. 粘貼時要開啟粘貼模式隱藏行號 :set paste :set nonu

# 如何將伺服器中的文件整體複製出來
1. 退出tmux
2. `cat filename`:展示filename的文件內容
3. 滑鼠選中文本開頭的若幹字元
4. 用滾輪滑到文件結尾
5. 按住Shift,同時滑鼠點擊文件結尾,此時會選中文件所有內容
6. Windows/Linux下,按Ctrl + insert可以複製全文;Mac下,按Command + c可以複製全文。

第一題


(1) 進入homework_1文件夾,編寫腳本check_file.sh。要求:
    [1] 當前目錄下僅包含check_file.sh。
    [2] check_file.sh具有可執行許可權。
    [3] check_file.sh接收一個傳入參數。格式為 ./check_file.sh file
    [4] 判斷傳遞參數,分別在標準輸出中輸出如下內容(不包括雙引號):
        1) 如果傳入參數個數不是1,則輸出一行:"arguments not valid",然後退出,退出狀態等於1。
        2) 如果file文件不存在,則輸出一行:"not exist",然後退出,退出狀態等於2。
        3) 如果file文件存在,則輸出分別進行如下5個判斷,然後退出,退出狀態等於0。
            1] 如果file為普通文件,則輸出一行:"regular file"
            2] 如果file為目錄(文件夾),則輸出一行:"directory"
            3] 如果file具有可讀許可權,則輸出一行:"readable"
            4] 如果file具有可寫許可權,則輸出一行:"writable"
            5] 如果file具有可執行許可權,則輸出一行:"executable"

cd /home/acs/homework/lesson_3/homework_1
ls -a
vim check_file.sh :wq
ls -l check_file.sh
chmod +x check_file.sh
vim check_file.sh
# ./check_file.sh file

#! /bin/bash

if [ $# -ne 1]
then
	echo arguments not valid
	exit 1
fi

# 中間帶空格的字元串要加雙引號
if [ ! -e "$i" ]
then
	echo not exist
	exit 2
fi

if [ -f "$1" ]
then
	echo regular file
	#exit 0 # 預設就是返回0,不寫也行
fi

if [ -d "$1" ]
then
	echo directory
fi

if [ -r "$1" ]
then
	echo readable
fi

if [ -w "$1" ]
then
	echo writable
fi

if [ -x "$1" ]
then
	echo executable
fi

第二題


(2) 進入homework_2文件夾,編寫腳本main.sh。要求:
    [1] 當前目錄下僅包含main.sh
    [2] main.sh具有可執行許可權
    [3] 該文件從stdin(標準輸入)中讀取一個整數n
    [4] 在stdout(標準輸出)輸出斐波那契數列的第n項。即:a[0] = 1, a[1] = 1, a[i] = a[i - 1] + a[i - 2], 求a[n]。
    [5] 數據保證 0 <= n <= 20,腳本不需要判斷n的合法性。

cd /home/acs/homework/lesson_3/homework_2
ls -a
vim main.sh :wq
ls -l main.sh
chmod +x main.sh
vim main.sh

#! /bin/bash

read n
# 等號兩邊不能加空格
a[0]=1
a[1]=1

for ((i=2;i<=n;i++))
do
	x=$(expr &i - 1) # x = a[i-1]
	y=$(expr &i - 2)
	a[$i]=$(expr ${a[$x]} + ${a[$y]}) # a[i] = a[i-1] + a[i-2]
done

echo ${a[$n]}

第三題


(3) 進入homework_3文件夾,編寫腳本main.sh。要求:
    [1] 當前目錄下僅包含main.sh
    [2] main.sh具有可執行許可權
    [3] 該文件從stdin(標準輸入)中讀取兩行整數n和m
    [4] 在stdout(標準輸出)中輸出1~n的按字典序從小到大的順序數第m個全排列,輸出一行,用空格隔開所有數,行末可以有多餘空格。
    [5] 數據保證 1 <= n <= 10, 1 <= m <= min(100, n!),腳本不需要判斷數據的合法性。

cd /home/acs/homework/lesson_3/homework_3
ls -a
vim main.sh :wq
ls -l main.sh
chmod +x main.sh

# 先用c++進行編寫
#include<iostream>
using namespace std;
const int N = 110;

int n,m;	// n個數找第m個全排列
int path[N];	// 路徑數組
bool st[N];	// 狀態數組,看第i個數是否被用過

bool dfs(int u){
	if(u==n){
		m--;
		if(!m){
			for(int i=0;i<n;i++)
				cout << path[i] << '';
			cout << endl;
			return true;
		}
		return false;
	}
	for(int i=1;i<=n;i++){
		if(!st[i]){
			path[u] = i;
			st[i] = true;
			if(dfs(u+1))
				return true;
			// 恢復現場
			st[i] = false;
		}
	}
	return false;
}

int main(){
	cin >> n >> m;
	dfs(0);	//從第0位開始
	return 0;
}

vim main.sh

#! /bin/bash

read n
read m

# 初始化數組
for((i=1;i<=n;i++))
do
	st[$i]=0 # 0表示false
done

# dfs流程
dfs(){
	if [ $1 -eq $n ]
	then
		m=`expr $m - 1`
		if [ $m -eq 0 ]
		then
			echo ${path[@]}
			return 0 # 正常結束
		fi
		return 1
	fi
	
	local j=0 # 其他層遞歸的dfs會改變原來迴圈中的j
	for((j=1;j<=n;j++))
	do
		if [ ${st[$j]} -eq 0 ]
		then
			path[$1]=$j
			st[$j]=1
			
			if dfs `expr $1 + 1`
			then
				return 0
			fi
			
			st[$j]=0
		fi
	done
	
	return 1
}

# 執行dfs,從第0位開始
dfs 0

第四題


(4) 進入homework_4文件夾,編寫腳本main.sh。要求:
    [1] 當前目錄下僅包含main.sh
    [2] main.sh具有可執行許可權
    [3] main.sh接收兩個傳入參數。格式為 ./main.sh input_file output_file
    [4] 從input_file中讀取一個正整數n,然後將前n個正整數的平方和寫入output_file中
    [5] 數據保證 1 <= n <= 100,腳本不需要判斷所有數據的合法性。

cd /home/acs/homework/lesson_3/homework_4
ls -a
vim main.sh :wq
ls -l main.sh
chmod +x main.sh

input_file=$1
output_file=$2

read n < $input_file

sum = 0

for ((i=1;i<=n;i++))
do
	sqr=`expr $i \* $i`
	sum=`expr $sum + $sqr`
done

echo $sum > $output_file

echo 10 > input.txt
./main.sh input.txt output.txt

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • C 語言中的數據類型 C 中的變數必須是指定的數據類型,並且您必須在 printf() 函數中使用格式說明符來顯示它: // 創建變數 int myNum = 5; // 整數(沒有小數點) float myFloatNum = 5.99; // 浮點數 char myLetter = 'D'; / ...
  • Qt 是一個跨平臺C++圖形界面開發庫,利用Qt可以快速開發跨平臺窗體應用程式,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現圖形化開發極大的方便了開發效率,本章將重點介紹`tabWidget`選擇夾組件與`TreeWidget`樹形選擇組件,的常用方法及靈活運用。 ...
  • 二二、函數(五) 1、static和inline 1)靜態變數 利用static可以聲明一個靜態變數,static變數如果沒有指定初始化的值,那麼會初始化為0,無論有沒有指定初始值,都只會初始化一次,靜態變數的值不會因函數大括弧結束而消失。語法如下 //static語法 static 類型 變數名稱 ...
  • Qt 是一個跨平臺C++圖形界面開發庫,利用Qt可以快速開發跨平臺窗體應用程式,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實現圖形化開發極大的方便了開發效率,本章將重點介紹`ToolBar`工具欄組件以及與之類似的`MenuBar`菜單欄組件的常用方法及靈活運用。 ...
  • 本文介紹了流程式控制制中的迴圈結構,包括while迴圈、do-while迴圈和普通for迴圈。同時,還介紹了在Intellij IDEA中使用迴圈的快捷鍵,以提高編程效率。 ...
  • 星索稱重/生產管理軟體 聯機版V1.0 一、特點 1.支持多用戶、多組織管理,靈活控制用戶許可權。 2.支持地磅秤、智能電子秤、軌道秤等多款稱重設備。 3.支持三聯單/熱敏紙等多種列印模板。 二、系統截圖 1.首頁 2.批次管理 3.包裝稱重 4.供應商管理 5.產品管理 6.稱重記錄 7.產品分組 ...
  • 介紹 一個源代碼生成器,用於向 C#項目添加一組用戶定義的 Win32 P/Invoke 方法和相關的類型。 鏈接地址: https://github.com/microsoft/CsWin32 還在手動添加平臺調用的代碼或者增加無用的程式集?微軟的官方解決方案來了! 特色 快速將 P/Invoke ...
  • 使用開源、免費軟體進行取證(不氪金取證方法) Autopsy https://www.autopsy.com Autopsy® is the premier end-to-end open source digital forensics platform. Built by Basis Techn ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...