linux獲取輸入
1. c語言,linux下,如何像vi那樣獲取一個鍵盤輸入而不等待回車
getche()函數
2. linux腳本獲取輸入參數
用eval,可以把字元串當作命令來執行:
val=2
eval "x=$$val"
echo $x
2. 用"$@"把參數列表轉化成數組
val=1
x=( "$@" )
echo "${x[$val]}"
注意:數組是從0開始的,也就是 ${x[0]} 對應 $1、${x[1]} 對應 $2,依次類推……
3. linux shell 腳本讀取用戶輸入的參數如何解決
while read var
do
echo $var
done
這樣也是可以的,沒錯。
想回退的話用 ctrl+backspace
4. linux下循環讀取鍵盤輸入問題
scanf結束標志:
① 遇空格、「回車」、「跳格」鍵。
② 遇寬度結束。
③ 遇非法輸入。
如果要識別空格的話 有三種方法:
1.人工加空格法:
用個變數讀沒有空格的單詞,另一個變數存儲變數,變數間用空格隔開。
2.gets()函數
這個函數用法比較危險,因為它無法判字元串的長度
如char a[10];
您的輸入是abcdefggjhh dddda dddd
明顯超過10個字元 而a數組只是存儲了10個字元
3.繼續我們的scanf函數 但是有規定只能是字母跟數字組成的字元串
scanf("%[ a-zA-Z0-9]s", str);
我們來看個例子:
#include <stdio.h>
int main()
{
char str[20];
scanf("%[ a-zA-Z0-9]s", str);
printf("%s\n",str);
return 0;
}
輸入:
12a bbb ccc 123 1adb2
輸出:
12a bbb ccc 123 1adb2
希望對樓主你有所幫助
5. 在linux下怎樣用fread函數從輸入端讀取數據,輸入的數據數不確定,就是從從終端想輸多少就讀多少那種
用fgets(buffer,MAXLENTH,stdin)
buffer為程序裡面定義的char類型的數組
MAXLENTH為buffer的長度即:sizeof(buffer)
stdin為標准輸入端
這個函數的意思即為,從標准輸入端獲得MAXLENTH長度的字元串,存入buffer
fread的原型為fread(buffer,size,count,fp)它只能獲取二進制文件,如果你想用它
你就需要在終端輸入你看著辦吧~~~~~
圖中為linux中二進制的存儲形式
6. 在linux下,如何在用戶未敲回車之前實時的得到用戶輸入的信息
原來寫的不對,改了,已測。
#include<stdio.h>
#include<termios.h>
#include<unistd.h>
#include<assert.h>
#include<string.h>
intgetch(void);
intmain(void)
{
charch;
printf("Inputachar:");
fflush(stdin);
while(ch=getch())
{
if(ch=='q')break;
printf(" Youinputa%c ",ch);
}
return0;
}
intgetch(void)
{
intc=0;
structtermiosorg_opts,new_opts;
intres=0;
//-----storeoldsettings-----------
res=tcgetattr(STDIN_FILENO,&org_opts);
assert(res==0);
//----setnewterminalparms--------
memcpy(&new_opts,&org_opts,sizeof(new_opts));
new_opts.c_lflag&=~(ICANON|ECHO|ECHOE|ECHOK|ECHONL|ECHOPRT|ECHOKE|ICRNL);
tcsetattr(STDIN_FILENO,TCSANOW,&new_opts);
c=getchar();
//------restoreoldsettings---------
res=tcsetattr(STDIN_FILENO,TCSANOW,&org_opts);assert(res==0);
returnc;
}
7. linux怎麼讀取usb口的輸入
Linux不直接支持NTFS文件系統,如果U盤是NTFS文件系統就無法直接掛載使用。首先用lsblk列出所有塊設備:
1
lsblk
sd表示SCSI磁碟,後面跟a,b,c之類的字母表示第幾個磁碟,字母之後再跟數字表示這個磁碟的第幾個分區。大部分人只有一個硬碟,此時再接一個U盤,這個U盤就是sdb,U盤上的分區就是sdb1。除此以外,還可以根據顯示的容量判斷U盤設備名是sdb還是sdc。其他情況以此類推。
然後可以在用戶目錄創建一個usb目錄:(也可以根據喜好設置在其他地方,下面的掛載地址跟著改變即可)
1
mkdir ~/usb1
最後把U盤分區掛載到這個目錄即可:(可能會提示輸入密碼,輸入密碼後回車即可)
1
sudo mount /dev/sdb1 ~/usb1
然後就可以通過訪問 ~/usb1目錄來訪問U盤:
1
2
cd ~/usb1
ls
最後要拔出U盤以前,要卸載U盤:(卸載時要退出usb1目錄,不然無法卸載)(可能會提示輸入密碼,輸入密碼後回車即可)
8. java linux怎麼獲取前端輸入的字元
java程序中要執行linux命令主要依賴2個類:Process和Runtime
首先看一下Process類:
[plain] view plain
ProcessBuilder.start() 和 Runtime.exec 方法創建一個本機進程,並返回 Process 子類的一個實例,
該實例可用來控制進程並獲得相關信息。Process 類提供了執行從進程輸入、執行輸出到進程、等待進程完成、
檢查進程的退出狀態以及銷毀(殺掉)進程的方法。
創建進程的方法可能無法針對某些本機平台上的特定進程很好地工作,比如,本機窗口進程,守護進程,Microsoft Windows
上的 Win16/DOS 進程,或者 shell 腳本。創建的子進程沒有自己的終端或控制台。它的所有標准 io(即 stdin、stdout 和 stderr)
操作都將通過三個流 (getOutputStream()、getInputStream() 和 getErrorStream()) 重定向到父進程。
父進程使用這些流來提供到子進程的輸入和獲得從子進程的輸出。因為有些本機平台僅針對標准輸入和輸出流提供有限的緩沖區大小,
如果讀寫子進程的輸出流或輸入流迅速出現失敗,則可能導致子進程阻塞,甚至產生死鎖。
當沒有 Process 對象的更多引用時,不是刪掉子進程,而是繼續非同步執行子進程。
對於帶有 Process 對象的 Java 進程,沒有必要非同步或並發執行由 Process 對象表示的進程。
特別需要注意的是:
1,創建的子進程沒有自己的終端控制台,所有標注操作都會通過三個流
(getOutputStream()、getInputStream() 和 getErrorStream()) 重定向到父進程(父進程可通過這些流判斷子進程的執行情況)
2,因為有些本機平台僅針對標准輸入和輸出流提供有限的緩沖區大小,如果讀寫子進程的輸出流或輸入流迅速出現失敗,
則可能導致子進程阻塞,甚至產生死鎖
[plain] view plain
abstract void destroy()
殺掉子進程。
abstract int exitValue()
返回子進程的出口值。根據慣例,值0表示正常終止。
abstract InputStream getErrorStream()
獲取子進程的錯誤流。
abstract InputStream getInputStream()
獲取子進程的輸入流。
abstract OutputStream getOutputStream()
獲取子進程的輸出流。
abstract int waitFor()
導致當前線程等待,如有必要,一直要等到由該 Process 對象表示的進程已經終止。
如果已終止該子進程,此方法立即返回。如果沒有終止該子進程,調用的線程將被阻塞,直到退出子進程。
特別需要注意:如果子進程中的輸入流,輸出流或錯誤流中的內容比較多,最好使用緩存(注意上面的情況2)
再來看一下Runtime類:
[plain] view plain
每個Java應用程序都有一個Runtime類實例,使應用程序能夠與其運行的環境相連接。可以通過getRuntime方法獲取當前運行時環境。
應用程序不能創建自己的Runtime類實例。
介紹幾個主要方法:
[plain] view plain
Process exec(String command)
在單獨的進程中執行指定的字元串命令。
Process exec(String command, String[] envp)
在指定環境的單獨進程中執行指定的字元串命令。
Process exec(String command, String[] envp, File dir)
在有指定環境和工作目錄的獨立進程中執行指定的字元串命令。
Process exec(String[] cmdarray)
在單獨的進程中執行指定命令和變數。
Process exec(String[] cmdarray, String[] envp)
在指定環境的獨立進程中執行指定命令和變數。
Process exec(String[] cmdarray, String[] envp, File dir)
在指定環境和工作目錄的獨立進程中執行指定的命令和變數。
command:一條指定的系統命令。
envp:環境變數字元串數組,其中每個環境變數的設置格式為name=value;如果子進程應該繼承當前進程的環境,則該參數為null。
dir:子進程的工作目錄;如果子進程應該繼承當前進程的工作目錄,則該參數為null。
cmdarray:包含所調用命令及其參數的數組。
以下為示例(要打成可執行jar包扔到linux下執行):
[java] view plain
public class test {
public static void main(String[] args){
InputStream in = null;
try {
Process pro = Runtime.getRuntime().exec(new String[]{"sh",
"/home/test/test.sh","select admin from M_ADMIN",
"/home/test/result.txt"});
pro.waitFor();
in = pro.getInputStream();
BufferedReader read = new BufferedReader(new InputStreamReader(in));
String result = read.readLine();
System.out.println("INFO:"+result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
在這用的是Process exec(String[] cmdarray)這個方法
/home/test/test.sh腳本如下:
[plain] view plain
#!/bin/sh
#查詢sql
SQL=$1
#查詢結果保存文件
RESULT_FILE=$2
#資料庫連接
DB_NAME=scott
DB_PWD=tiger
DB_SERVER=DB_TEST
RESULT=`sqlplus -S ${DB_NAME}/${DB_PWD}@${DB_SERVER}<< !
set heading off
set echo off
set pages 0
set feed off
set linesize 3000
${SQL}
/
commit
/
!`
echo "${RESULT}" >> ${RESULT_FILE}
echo 0;
特別需要注意的是,當需要執行的linux命令帶有管道符時(例如:ps -ef|grep java),用上面的方法是不行的,解決方式是將需要執行的命令作為參數傳給shell
[java] view plain
public class Test {
public static void main(String[] args) throws Exception{
String[] cmds = {"/bin/sh","-c","ps -ef|grep java"};
Process pro = Runtime.getRuntime().exec(cmds);
pro.waitFor();
InputStream in = pro.getInputStream();
BufferedReader read = new BufferedReader(new InputStreamReader(in));
String line = null;
while((line = read.readLine())!=null){
System.out.println(line);
}
}
}
PS:
Runtime.getRuntime().exec()這種調用方式在java虛擬機中是十分消耗資源的,即使命令可以很快的執行完畢,頻繁的調用時創建進程消耗十分客觀。
java虛擬機執行這個命令的過程是,首先克隆一條和當前虛擬機擁有一樣環境變數的進程,再用這個新的進程執行外部命令,最後退出這個進程。頻繁的創建對CPU和內存的消耗很大
9. Linux shell 腳本 間接獲取輸入參數的方法
如果是bash,可以用indirect expansion來搞,語法為 ${!var}。
比如
foo=bar
bar=123
echo ${!foo}
會列印 123
再比如下面的腳本,依次列印腳本的各個輸入參數。
#!/bin/bash
var=1
while [ $var -le $# ]
do
echo "Param $var is ${!var}"
let var++
done
不用indirect expansion,也可以用 eval, 比如
#!/bin/bash
var=1
while [ $var -le $# ]
do
eval echo "Param $var is \$$var"
let var++
done
10. linux中的命令如何輸入
需要在終端中輸入命令進行操作,打開終端有如下4種方法,建議你這樣試試看:
1. 快捷鍵,「Ctrl + Alt + T」, 打開終端,輸入命令,如 ls,
然後在終端輸入linux命令,如:ls,whoami, pwd, 等等。