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, 等等。