Harsh Harsh - 4 years ago 79
Bash Question

How to declare variable name equal to filename present in a directory and variable value equal to content of file?

I have some files in a folder with content as a 4 digit number in each file. How can I export variable

and its
with a loop in bash?

Answer Source

It is quite simple.

for file in "$dir"/*
  [[ -f "$file" ]] || continue
    printf -v "$var" "$(<"$file")" 2>/dev/null
    export "$var"
    echo "Invalid filename: $file"

Not all filenames are valid variable names. You would need to either make 100% sure all files you could ever use your script with have names that are valid variable names, or (preferably) perform some kind of test or error handling. The script above will detect a failed assignment, but will not do anything to clever aside from complaining.

Some explanations...

The loop body is skipped if the file is not a regular file (i.e. directory, special files are skipped).

The code uses the -v option of printf, which causes printf to assign a value whose name is provided instead of printing to stdout. This is safer than, say, improperly using eval, which would open up code injection possibilities, especially considering you are using filenames which the script cannot control.

The "$(<"$file")" statement is a command substitution that outputs the content of the file, like a redirection that produces a string rather than a stream.

Finally, please note that if you want to export the variables in preparation for other things your script will do, you are fine. However, if you want to export these variables to the shell that calls the script, you will need to execute the script with . (or source), because a child process can never export (or make any kind of assignment) to the variables of its parent. Sourcing causes the shell to read the commands from the stated file without starting a child process.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download