當前位置:首頁 » 編程軟體 » shell實驗編程

shell實驗編程

發布時間: 2022-07-06 22:32:59

1. 幾個好玩的Shell腳本編程實驗

通常就兩種方式。 1. 命令行中通過指定命令解釋器(sh或bash)來執行。 sh ./script.shbash ./script.sh這種情況不要求腳本本身有可執行許可權。 2. 直接執行腳本。 ./script.sh需要腳本有可執行許可權。 即,首先要通過 chmod +x ./script.sh 賦予...

2. 有關於shell編程

,然後編寫shell程序,採用循環結構,當賬號和密

3. 請問shell編程是什麼請高手指點!

shell是一個命令處理器(command processor)——是一個讀入並解釋你輸入的命令的程序。除了是一個命令中斷器以外,shell還是一個程序設計語言。你可以編寫shell可以解釋的程序(被稱為源程序),這些源程序可以包含shell程序設計命令等等。shell除了解釋命令以外,還有其他工作,它也可以配置和編程。shell擁有自己的語言允許用戶編寫程序並以一種復雜方式運行。shell編程語言具有許多常用的編程語言的特徵,例如:循環和控制結構等。用戶可以生成像其他應用程序一樣復雜的shell程序。
補充說明:簡單的說 : shell 是一個交互性命令解釋器。shell獨立於操作系統,這種設計讓用戶可以靈活選擇適合自己的shell。shell讓你在命令行鍵入命令,經過shell解釋後傳送給操作系統(內核)執行。
一下是shell功能的一個匯總:
查找命令的位置並且執行相關聯的程序。
為shell變數賦新值
執行命令替代
處理 I/O重定向和管道功能
提供一個解釋性的編程語言界面,包括tests、branches和loops等語句

4. Shell的簡單編程

$cat test.sh
#!/bin/bash
if [ -c $1 ];then
echo "$1是字元設備文件"
else test -e $1 || echo "This file is not exist"
fi
if test -d $2;then
echo "$2是目錄文件"
for file in `ls $2/*.c`
do
ls -l $file
done
else test -e $2 || echo "This file is not exist"
fi
$./test.sh ddd.c test
test是目錄文件
-rw-rw-r--. 1 flycat flycat 0 1月 1 21:20 test/aaa.c
-rw-rw-r--. 1 flycat flycat 0 1月 1 21:20 test/bbb.c
-rw-rw-r--. 1 flycat flycat 0 1月 1 21:20 test/ccc.c

5. Shell編程的實現方法

前面所說的直接使用Windows操作系統部分功能的編程方法就是針對Windows操作系統外殼的編程,可以通過對操作系統提供的幾個編程介面對操作系統的部分功能進行調用,甚至可以按照自己的意圖在應用程序中對部分功能進行修改、擴展。但這方面的資料介紹不是特別多,講的也大都語焉不詳,而且用通常的編程方法去進行外殼編程是非常麻煩的,動輒就要對相關的結構對象進行設置,而這樣的結構里的數據成員少則十來個多則幾十個,因此配置起來非常煩瑣,下面就以一個比較簡單的外殼操作--拷貝文件進行舉例說明: ……
SHFILEOPSTRUCT FileOp; //外殼的文件操作結構
FileOp.hwnd=m_hWnd; //設置句柄
//設置操作方式,拷貝用FO_COPY,刪除用 FO_DELETE
FileOp.wFunc=FO_COPY;
FileOp.pFrom=m_source; //源文件路徑
FileOp.pTo=m_detect; //目標文件路徑
FileOp.fFlags=FOF_ALLOWUNDO; //允許恢復
FileOp.hNameMappings=NULL;
FileOp.lpszProgressTitle=strTitle; //設置標題
SHFileOperation(&FileOp); //執行外殼拷貝
if(FileOp.fAnyOperationsAborted) //監測有無中止
TRACE(An Operation was aborted!!! );
…… 上述代碼實現起來雖然效果還是不錯的,但然實現起來卻是比較麻煩的,這僅僅是一個比較簡單的外殼操作,對於一些比較復雜的外殼操作比如系統托盤、任務條等等的編程,更是尤為嚴重,而且象此類編程,MFC里並沒有提供封裝好的程序類庫,提供的只有系統的WinAPI 應用程序介面,因此在程序開發過程中往往會有一種在進行SDK編程的感覺。
COM (Component Object Model,組件對象模型)是Microsoft創建的一種二進制和網路標准,也是Microsoft大力推廣並已取得廣泛認可的一種組件標准。在COM標准中,COM對象被很好的封裝起來,客戶無法訪問對象的實現細節,提供給用戶的唯一的訪問途徑是通過COM介面來訪問。對於COM介面有兩方面的含義:首先它是一組可供調用的函數,由此客戶可以讓該對象做某些事情;其次,也是更為重要的,介面是組件及其客戶程序之間的協議。也就是說介面不但定義了可用什麼函數,也定義了當調用這些函數時對象要做什麼。Windows操作系統本身作為一個大的COM組件對象,也提供了一些必要的COM介面給客戶程序,因此我們可以通過這些COM介面來直接對Windows外殼進行編程。
在程序進行正式編寫設計之前有一點是肯定的:程序里需要用到COM介面,要對COM對象進行操作。因此首先要加入初始化COM和終止COM的代碼。一般是在應用程序類的InitInstance()函數的開始處和返回前添加初始化COM和終止COM代碼的: ……
CoInitialize(NULL); //初始化COM
……
CoUninitialize(); //終止COM代碼
…… 以上兩個函數在MFC程序和非MFC程序中都可以很好的使用。另外,如果程序框架是以MFC為基礎的,那麼只需簡單的調用AfxOleInit()函數就可以達到同樣的目的。而且不必顯式調用終止COM的代碼。在COM標准中,訪問COM對象的唯一途徑是COM介面,因此在編寫操縱Windows 系統外殼程序首先要得到其提供的COM介面。所用的COM介面是IShellDispatch,它是從IDispatch介面派生來的,在VC安裝目錄的VC98IncludeExdisp.h頭文件中有定義,下面節選了一些將要用到的介面定義: ……
EXTERN_C const IID IID_IShellDispatch;
#if defined(__cplusplus) && !defined(CINTERFACE)
interface DECLSPEC_UUID(D8F015C0-C278-11CE-A49E-444553540000)
IShellDispatch : public Idispatch
{
public:
……
virtual HRESULT STDMETHODCALLTYPE MinimizeAll( void) = 0;
virtual HRESULT STDMETHODCALLTYPE UndoMinimizeALL( void) = 0;
virtual HRESULT STDMETHODCALLTYPE FileRun( void) = 0;
virtual HRESULT STDMETHODCALLTYPE CascadeWindows( void) = 0;
virtual HRESULT STDMETHODCALLTYPE TileVertically( void) = 0;
virtual HRESULT STDMETHODCALLTYPE TileHorizontally( void) = 0;
virtual HRESULT STDMETHODCALLTYPE ShutdownWindows( void) = 0;
virtual HRESULT STDMETHODCALLTYPE Suspend( void) = 0;
virtual HRESULT STDMETHODCALLTYPE SetTime( void) = 0;
virtual HRESULT STDMETHODCALLTYPE TrayProperties( void) = 0;
virtual HRESULT STDMETHODCALLTYPE Help( void) = 0;
virtual HRESULT STDMETHODCALLTYPE FindFiles( void) = 0;
virtual HRESULT STDMETHODCALLTYPE FindComputer( void) = 0;
};
…… 該介面在CoCreateInstance()函數創建COM對象時將會得到指向其的指針,通過這個函數客戶程序可以避免顯式同類廠打交道,其實該函數內部也調用了CoGetClassObject()函數來獲取COM對象的類廠,只不過它把通過類廠創建對象的過程封裝起來了,只需用戶指定對象類的CLSID和待輸出的介面指針及介面ID,顯然這樣直接創建COM對象是非常便捷的,在獲取到COM對象指針之後就可以通過這個指針去訪問調用COM對象里的方法來實現Windows 外殼的種種功能調用了。下面是實現該功能的部分關鍵代碼: ……
HRESULT sc;//返回結果
IShellDispatch *pShellDisp = NULL; //初始化介面指針
//直接創建COM對象
sc = CoCreateInstance( CLSID_Shell,//指定待創建的COM對象標識符
NULL, //指定被聚合時的外部對象的介面指針
CLSCTX_SERVER, //指定組件類別,可以指定進程內組件進程外組件或者進程內控制對象。
IID_IDispatch, //指定介面ID,需要注意的是這里指的是待
//創建的COM對象的介面ID,而非類廠對象的介面標識符
(LPVOID *) &pShellDisp );//存放函數返回的對象的介面指針
/* 在上述代碼中,CoCreateInstance首先調用CoGetClassObject函數創建類廠對象,然後用得到的類廠對象的介面指針創建真正的COM對象,最後把類廠對象釋放並返回,這樣就很好的把類廠屏蔽起來,使用戶用起來更為簡單。*/
if( FAILED(sc) )//必須用FAILED 或SUCCECCED來判斷COM對象是否創建成功
return;
pShellDisp->FindFiles(); //調用COM對象里的方法
pShellDisp->Release(); //釋放申請到的介面指針
…… 在這里通過pShellDisp介面指針調用了COM對象的FindFiles()方法去進行查找文件的系統外殼操作。同樣,可以根據實際需要靈活調用響應的方法來執行相應的外殼操作,主要有以下幾個方法:MinimizeAll:所有窗口最小化、UndoMinimizeALL:恢復窗口最小化、FileRun:開始菜單的運行…、CascadeWindows:層疊窗口、TileVertically:垂直平鋪、TileHorizontally:水平平鋪、ShutdownWindows:關閉Windows、Suspend 掛起計算機、SetTime:設定時間、TrayProperties:任務欄屬性、Help Windows:幫助、FindFiles:查找文件、FindComputer:查找計算機等。
這些介面均在VC安裝目錄的VC98IncludeExdisp.h頭文件中有定義,可以通過對該文件的查看來編寫響應的外殼操作代碼。

6. 和高級語言相比,shell編程有什麼特點

Shell 是系統的用戶界面,提供了用戶與內核進行交互的介面,它接收用戶輸入的命令並把它送到內核去執行,是一種命令解釋器(圖1)。另外,作為一門語言Shell編程語言具有普通編程語言的很多特點。Shell有很多版本,包括Bourne Shell、BASH、C Shell等,常用的就是BASH。

Linux下命令解釋器稱為Shell,Shell是一種具備特殊功能的程序,它是介於使用者和 UNIX/Linux 操作系統之核心程序(kernel)間的一個介面。它接收用戶輸入的命令並把它送入內核去執行。不僅如此,Shell有自己的編程語言用於對命令的編輯,它允許用戶編寫由shell命令組成的程序。Shell編程語言具有普通編程語言的很多特點,比如它也有循環結構和分支控制結構等,用這種編程語言編寫的Shell程序與其他應用程序具有同樣的效果。

Linux系統提供多種不同的Shell以供選擇。常用的有Bourne Shell(簡稱sh)、C-Shelll(簡稱csh)、Korn Shell(簡稱ksh)和Bourne Again Shell (簡稱bash)。----以下內容來自於教材。

(1)Bourne Shell是AT&T Bell實驗室的 Steven Bourne為AT&T的Unix開發的,它是Unix的默認Shell,也是其它Shell的開發基礎。Bourne Shell在編程方面相當優秀,但在處理與用戶的交互方面不如其它幾種Shell。

(2)C Shell是加州伯克利大學的Bill Joy為BSD Unix開發的,與sh不同,它的語法與C語言很相似。它提供了Bourne Shell所不能處理的用戶交互特徵,如命令補全、命令別名、歷史命令替換等。但是,C Shell與BourneShell並不兼容。

(3)Korn Shell是AT&T Bell實驗室的David Korn開發的,它集合了C Shell和Bourne Shell的優點,並且與Bourne Shell向下完全兼容。Korn Shell的效率很高,其命令交互界面和編程交互界面都很好。

(4)Bourne Again Shell (即bash)是自由軟體基金會(GNU)開發的一個Shell,它是Linux系統中一個默認的Shell。Bash不但與Bourne Shell兼容,還繼承了C Shell、Korn Shell等優點。

7. 什麼是shell腳本編程

一種類似 Java, PHP 的編程,一般編寫較小(可能非常小)的程序,用於做一建配置等用途,需在 Linux Shell 環境中使用。比如 Oh My Zsh 的安裝文件(https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)就是一個 Shell 程序。

8. Shell編程的編程過程

/////////////////////////////////////
#define INC_OLE2
#define WIN32_LEAN_AND_MEAN
#define STRICT
#include <windows.h>
#include <windowsx.h>
#include <commctrl.h>
#include <shlguid.h>
#include <exdisp.h>
#include 「taskbar.h」
#include 「resource.h」
// data
static WNDPROC g_pfnOldProc;
static HWND g_hwndButton=NULL;
static HWND g_hDlg=NULL;
static HINSTANCE g_hInstance;
static HICON g_hIconLarge;
static HICON g_hIconSmall;
// functions
static VOID OnRunPrograms( VOID );
static VOID OnFindFiles( VOID );
static VOID OnMinimizeAll( VOID );
static VOID OnUndoMinimize( VOID );
static VOID OnTaskbarProperties( VOID );
static VOID OnAddTab( HWND );
static VOID OnDeleteTab( VOID );
static VOID OnInitDialog( HWND );
static VOID OnButtonActivation( VOID );
// callbacks
LRESULT CALLBACK APP_DlgProc( HWND, UINT, WPARAM, LPARAM );
LRESULT CALLBACK ButtonProc( HWND, UINT, WPARAM, LPARAM );
INT APIENTRY WinMain( HINSTANCE hInstance, HINSTANCE hPrevious,
LPSTR lpsz, INT iCmd )
{
BOOL b;
g_hIconLarge = (HICON) LoadImage( hInstance, 「APP_ICON」, IMAGE_ICON,
GetSystemMetrics(SM_CXICON), GetSystemMetrics(SM_CXICON), 0 );
g_hIconSmall = (HICON) LoadImage( hInstance, 「APP_ICON」, IMAGE_ICON,
GetSystemMetrics(SM_CXSMICON), GetSystemMetrics(SM_CXSMICON), 0 );
// initialize OLE libraries
CoInitialize(NULL);
InitCommonControls();
// run main dialog
g_hInstance = hInstance;
b = DialogBox( hInstance, 「DLG_MAIN」, NULL, (DLGPROC)APP_DlgProc );
// exit
DestroyIcon( g_hIconLarge );
DestroyIcon( g_hIconSmall );
// free the objects used by ITaskbarList
DestroyWindow( g_hwndButton );
OnDeleteTab();
CoUninitialize();
return b;
}LRESULT CALLBACK APP_DlgProc( HWND hDlg, UINT uiMsg, WPARAM wParam, LPARAM lParam )
{
switch( uiMsg )
{
case WM_INITDIALOG:
OnInitDialog( hDlg );
break;
case WM_COMMAND:
switch( wParam )
{
case IDC_FINDFILES:
OnFindFiles();
return 1;
case IDC_RUNPROGRAMS:
OnRunPrograms();
return 1;
case IDC_MINIMIZE:
OnMinimizeAll();
return 1;
case IDC_UNDOMINIMIZE:
OnUndoMinimize();
return 1;
case IDC_PROPERTIES:
OnTaskbarProperties();
return 1;
case IDC_ADDTAB:
OnAddTab( hDlg );
return 1;
case IDC_DELETETAB:
OnDeleteTab();
return 1;
case IDCANCEL:
EndDialog( hDlg, FALSE );
return 0;
}
break;
}
return 0;
}
VOID OnFindFiles( VOID )
{
HRESULT sc;
IShellDispatch *pShellDisp = NULL;
sc = CoCreateInstance( CLSID_Shell, NULL, CLSCTX_SERVER, IID_IDispatch, (LPVOID *) &pShellDisp );
if( FAILED(sc) )
return;
pShellDisp->FindFiles();
pShellDisp->Release();
return;
}
VOID OnTaskbarProperties( VOID )
{
HRESULT sc;
IShellDispatch *pShellDisp = NULL;
sc = CoCreateInstance( CLSID_Shell, NULL, CLSCTX_SERVER,IID_IDispatch, (LPVOID *) &pShellDisp );
if( FAILED(sc) )
return;
pShellDisp->TrayProperties();
pShellDisp->Release();
return;
}
VOID OnRunPrograms( VOID )
{
HRESULT sc;
IShellDispatch *pShellDisp = NULL;
sc = CoCreateInstance( CLSID_Shell, NULL, CLSCTX_SERVER, IID_IShellDispatch, (LPVOID *) &pShellDisp );
if( FAILED(sc) )
return;
pShellDisp->FileRun();
pShellDisp->Release();
return;
}
VOID OnMinimizeAll( VOID )
{
HRESULT sc;
IShellDispatch *pShellDisp = NULL;
sc = CoCreateInstance( CLSID_Shell, NULL, CLSCTX_SERVER,
IID_IDispatch, (LPVOID *) &pShellDisp );
if( FAILED(sc) )
return;
pShellDisp->MinimizeAll();
pShellDisp->Release();
return;
}
VOID OnUndoMinimize( VOID )
{
HRESULT sc;
IShellDispatch *pShellDisp = NULL;
sc = CoCreateInstance( CLSID_Shell, NULL, CLSCTX_SERVER,
IID_IDispatch, (LPVOID *) &pShellDisp );
if( FAILED(sc) )
return;
pShellDisp->UndoMinimizeALL();
pShellDisp->Release();
return;
}
VOID OnInitDialog( HWND hDlg )
{
// set the icons (T/F as to Large/Small icon)
g_hDlg = hDlg;
SendMessage( hDlg, WM_SETICON, FALSE, (LPARAM)g_hIconSmall );
SendMessage( hDlg, WM_SETICON, TRUE, (LPARAM)g_hIconLarge );
}
VOID OnAddTab( HWND hWnd )
{
static BOOL g_bFirstTime=TRUE;
HRESULT sc;
ITaskbarList *pDisp = NULL;
sc = CoCreateInstance( CLSID_TaskbarList, NULL, CLSCTX_SERVER, IID_ITaskbarList, (LPVOID *) &pDisp );
if( FAILED(sc) )
return;
// call the first time only
if( g_bFirstTime )
{
g_bFirstTime = FALSE;
pDisp->HrInit();
// create a new button window
g_hwndButton = CreateWindow( 「button」, 「My Button」, WS_CLIPSIBLINGS|BS_PUSHBUTTON,0, 0, 58, 14, hWnd, NULL, g_hInstance, NULL );
g_pfnOldProc = (WNDPROC) SubclassWindow( g_hwndButton, ButtonProc );
}
pDisp->AddTab( g_hwndButton );
pDisp->Release();
return;
}
VOID OnDeleteTab( VOID )
{
HRESULT sc;
ITaskbarList *pDisp = NULL;
sc = CoCreateInstance( CLSID_TaskbarList, NULL, CLSCTX_SERVER, IID_ITaskbarList, (LPVOID *) &pDisp );
if( FAILED(sc) )
return;
pDisp->DeleteTab( g_hwndButton );
pDisp->Release();
return;
}
LRESULT CALLBACK ButtonProc( HWND hwnd, UINT uiMsg, WPARAM wParam, LPARAM lParam )
{
switch( uiMsg )
{
case WM_NCACTIVATE:
if( wParam==TRUE )
OnButtonActivation();
break;
}
return CallWindowProc( g_pfnOldProc, hwnd, uiMsg, wParam, lParam );
}
VOID OnButtonActivation( VOID )
{
HMENU hmenu;
RECT r;
LONG x, y;
// get some window handles
HWND h0=FindWindow(「Shell_TrayWnd」, NULL );
HWND h1=FindWindowEx(h0,NULL,」RebarWindow32″, NULL);
HWND h2=FindWindowEx(h1,NULL,」MSTaskSwWClass」, NULL);
HWND h3=FindWindowEx(h2,NULL,」SysTabControl32″, NULL);
GetWindowRect( h3, &r );
// get the currently selected button and
// create a new popup menu
hmenu = CreatePopupMenu();
INT i=TabCtrl_GetCurSel( h3 );
if( i==-1 )
{
AppendMenu( hmenu, MF_STRING, IDC_DELETETAB,」&Close」 );
}
else
{
AppendMenu( hmenu, MF_STRING, IDC_MINIMIZE,」&Minimize All」 );
AppendMenu( hmenu, MF_STRING, IDC_UNDOMINIMIZE,」&Undo Minimize All」 );
AppendMenu( hmenu, MF_SEPARATOR, 0, NULL );
AppendMenu( hmenu, MF_STRING, IDC_PROPERTIES,」&Taskbar Properties」 );
}
// set and immediately reset its size to get
// the current width and height
LONG l = TabCtrl_SetItemSize( h3, 0, 0 );
TabCtrl_SetItemSize( h3, LOWORD(l), HIWORD(l) );
// have the menu to appear just above the button
if( i==-1 )
{
POINT pt;
GetCursorPos( &pt );
x = pt.x;
y = pt.y;
}
else
{
x = r.left + LOWORD(l)*i+3;
y = GetSystemMetrics(SM_CYSCREEN)-(HIWORD(l)+1);
}
TrackPopupMenu( hmenu, TPM_BOTTOMALIGN, x, y, 0, g_hDlg, 0);
DestroyMenu( hmenu );
return;
}

9. SHELL編程幾個小例子

一個最簡單的 shell 編程例子(假設使用全屏幕編輯程序 vi 編輯、並保存一個文件名為:my_string.sh 的文件):
#!/bin/sh
#print my_string's content in the console window
my_string = "This is my first sentence !"
echo $my_string
其中:# 表示注釋語句,用雙引號引起來的是字元串的內容,my_string 是變數名,$ 表示求變數 my_string 的值,echo 表示將求得的 my_string 的值顯示在控制窗口上。
然後在 SHELL 提示符 $ 下面,輸入:chmod +x my_string.sh <cr> 將該文件的許可權修改為可執行許可權;
$./my_string.sh <cr> 在當前目錄下面執行 my_string.sh SHELL 腳本文件
當然了,UNIX/Linux 系統的 SHELL 功能是極其強大的,如果要想精通 SHELL 編程,還需要學習關於一些 awk、sed 等的使用。所以說想達到輕車熟路的程度也不是一件輕而易舉的事情,是需要經過長時間的上機編程體會的。

熱點內容
scratch少兒編程課程 發布:2025-04-16 17:11:44 瀏覽:642
榮耀x10從哪裡設置密碼 發布:2025-04-16 17:11:43 瀏覽:368
java從入門到精通視頻 發布:2025-04-16 17:11:43 瀏覽:89
php微信介面教程 發布:2025-04-16 17:07:30 瀏覽:312
android實現陰影 發布:2025-04-16 16:50:08 瀏覽:794
粉筆直播課緩存 發布:2025-04-16 16:31:21 瀏覽:348
機頂盒都有什麼配置 發布:2025-04-16 16:24:37 瀏覽:213
編寫手游反編譯都需要學習什麼 發布:2025-04-16 16:19:36 瀏覽:818
proteus編譯文件位置 發布:2025-04-16 16:18:44 瀏覽:369
土壓縮的本質 發布:2025-04-16 16:13:21 瀏覽:596